Est de type char *envp[] en tant que troisième argument de main() portable
pour obtenir une variable d'environnement dans un programme C
, on pourrait utiliser ce qui suit:
-
getenv()
-
extern char **environ;
mais à part ce qui précède, utilise-t-on char *envp[]
comme troisième argument de main()
pour obtenir les variables d'environnement considérées comme faisant partie de la norme?
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%sn",*envp++);
}
est char *envp[]
portable?
4 réponses
la fonction getenv
est la seule spécifiée par la norme C. La fonction putenv
, et l'extérieur environ
sont POSIX-spécifiques.
EDIT
le paramètre main
envp
n'est pas spécifié par POSIX mais est largement supporté.
une autre méthode d'accès à la liste d'environnement est de déclarer troisième argument de la fonction main ():
int main(int argc, char *argv[], char *envp[])
cet argument peut alors être traité de la même manière qu'environ, avec le différence que sa portée est locale à main (). Bien que cette caractéristique soit largement utilisé sur les systèmes UNIX, son utilisation doit être évitée car, outre la limitation de la portée, n'est pas spécifié dans SUSv3 .
ce n'est pas portable. *envp[]
est une chose UNIX traditionnelle, et tous les systèmes UNIX modernes ne l'implémentent pas.
aussi comme note latérale vous pouvez accéder à envp en faisant un pointeur transversal sur *argv[]
, le débordant...mais je ne pense pas que cela peut être considéré comme sûr programmation. Si vous regardez la carte mémoire du processus, vous verrez que envp[]
est juste au-dessus de argv[]
.
la norme décrit deux formats pour main
(voir 5.1.2.2.1 dans la norme C99 (pdf) )
a) int main(void)
et
b) int main(int argc, char **argv)
ou l'équivalent
et il permet aux implémentations de définir d'autres formats (ce qui permet un 3ème argument)
c) ou d'une autre manière définie par la mise en œuvre.
le 3ème argument est valide dans Microsoft C et GNU GCC: