Es char * envp como tercer argumento para main () portable

Para obtener una variable de entorno en un progtwig C , uno podría usar lo siguiente:

  • getenv()
  • extern char **environ;

Pero, aparte de lo mencionado anteriormente, ¿está utilizando char *envp[] como tercer argumento para main() para obtener las variables de entorno consideradas parte del estándar?

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

¿Es char *envp[] portátil?

La función getenv es la única especificada por el estándar C. La función putenv y el entorno externo son específicos de POSIX.

EDITAR

El parámetro main envp no está especificado por POSIX, pero es ampliamente compatible.

Un método alternativo para acceder a la lista de entornos es declarar un tercer argumento para la función main ():

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

Este argumento se puede tratar de la misma manera que el entorno, con la diferencia de que su scope es local a main (). Aunque esta característica se implementa ampliamente en sistemas UNIX, se debe evitar su uso ya que, además de la limitación del scope, no se especifica en SUSv3 .

No es portátil. *envp[] es una cosa tradicional de UNIX, y no todos los sistemas UNIX modernos lo implementan.

También como nota al margen, puede acceder a envp haciendo un recorrido de puntero sobre *argv[] , desbordando … pero no creo que pueda considerarse una progtwigción segura . Si echas un vistazo al mapa de memoria de proceso, verás que envp[] está justo encima de argv[] .

El estándar describe dos formatos para main (ver 5.1.2.2.1 en el estándar C99 (pdf) )

a) int main(void)

y

b) int main(int argc, char **argv) o equivalente

y permite a las implementaciones definir otros formatos (que pueden permitir un tercer argumento)

c) o de alguna otra manera definida por la implementación.

El tercer argumento es válido en Microsoft C y GNU GCC:

Visual Studio 2015: argumentos para main

Tutorial de progtwigción de GNU C: variables de entorno