是char * envp 作为main()便携式的第三个参数

为了在C程序中获得一个环境variables,可以使用下面的代码:

  • getenv()
  • extern char **environ;

但除了上面提到的,使用char *envp[]作为main()的第三个参数来获取被认为是标准的一部分的环境variables?

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

char *envp[]便携?

getenv函数是C标准中唯一指定的函数。 函数putenv和extern environ是POSIX特有的。

编辑

main参数envp不是由POSIX指定的,但被广泛支持。

访问环境列表的另一种方法是声明main()函数的第三个参数:

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

这个参数可以和environ一样对待,区别在于它的作用域是main()。 虽然这个特性在UNIX系统上被广泛实现,但是它的使用应该被避免,因为除了范围的限制外, 它在SUSv3中没有被指定

这不是便携式的。 *envp[]是一个传统的UNIX事物,并不是所有的现代UNIX系统都实现它。

另外作为一个便笺,你可以访问envp通过指针遍历*argv[] ,溢出它…但我不认为这可以被认为是安全的编程。 如果你看一下进程内存映射,你会看到envp[]就在argv[]之上。

该标准描述了main两种格式(见C99标准(pdf)中的5.1.2.2.1)

a) int main(void)

b) int main(int argc, char **argv)或等价物

它允许实现定义其他格式(可以允许第三个参数)

c)或者其他一些实现定义的方式。

第三个参数在Microsoft C和GNU GCC中有效:

Visual Studio 2015:主要的参数

GNU C编程教程:环境variables