read from fortnite c environment-variables command-line-arguments

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.



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