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?

50
demandé sur psmears 2012-04-25 22:17:36

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 .

40
répondu cnicutar 2012-04-25 18:27:06

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[] .

16
répondu skyel 2012-04-25 18:24:29

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.

13
répondu pmg 2012-04-25 18:25:49
5
répondu user3683366 2015-07-30 14:39:15