是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