web-dev-qa-db-fra.com

Char * envp [] est-il un troisième argument de main () portable

Afin d'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 char *envp[] Comme troisième argument de main() pour que les variables d'environnement soient considérées comme faisant partie de la norme?

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while(*envp)
        printf("%s\n",*envp++);
}

char *envp[] Est-il portable?

58

La fonction getenv est la seule spécifiée par la norme C. La fonction putenv et l'extern environ sont spécifiques à POSIX.

MODIFIER

Le paramètre mainenvp n'est pas spécifié par POSIX mais est largement pris en charge.

Une autre méthode d'accès à la liste d'environnement consiste à déclarer un troisième argument à la fonction main ():

int main(int argc, char *argv[], char *envp[])

Cet argument peut alors être traité de la même manière que l'environnement, à la différence près que sa portée est locale à main (). Bien que cette fonctionnalité soit largement implémentée sur les systèmes UNIX, son utilisation doit être évitée car, en plus de la limitation de la portée, elle n'est pas spécifiée dans SUSv3 .

47
cnicutar

Ce n'est pas portable. *envp[] est une chose UNIX traditionnelle, et tous les systèmes UNIX modernes ne l'implémentent pas.

Vous pouvez également accéder à envp en faisant un survol du pointeur sur *argv[], le débordant ... mais je ne pense pas que cela puisse être considéré comme une programmation sûre. Si vous jetez un œil à la carte de mémoire de processus, vous verrez que envp[] est juste au-dessus de argv[].

17
skyel

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 équivalent

et il permet aux implémentations de définir d'autres formats (ce qui peut autoriser un troisième argument)

c) ou d'une autre manière définie par la mise en œuvre.

14
pmg
6
user3683366