from - Es char*envp[] como tercer argumento para main() portable
read from command line c (4)
Para obtener una variable de entorno en un programa 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 <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s/n",*envp++);
}
¿Es char *envp[] portátil?
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:
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 alcance 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 alcance, 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 programación segura . Si echas un vistazo al mapa de memoria de proceso, verás que envp[] está justo encima de argv[] .