char*envp []是main()可移植的第三个参数

San*_*raj 59 c environment-variables command-line-arguments

为了在C程序中获取环境变量,可以使用以下内容:

  • getenv()
  • extern char **environ;

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

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    while(*envp)
        printf("%s\n",*envp++);
}
Run Code Online (Sandbox Code Playgroud)

char *envp[]便携式?

cni*_*tar 49

该功能getenv是C标准指定的唯一功能.该函数putenv和extern environ是特定于POSIX的.

编辑

main参数envp未由POSIX指定,但受到广泛支持.

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

int main(int argc, char *argv[], char *envp[])
Run Code Online (Sandbox Code Playgroud)

然后可以像environ一样处理这个参数,区别在于它的范围是main()的本地.尽管此功能在UNIX系统上广泛实现,但应避免使用它,因为除了范围限制之外,它在SUSv3中未指定.

  • 请注意,C标准认为这是一种常见的替代方案 - 即使C89在附录G中提到它(可移植性问题); 它在C99和C11的附录J(可移植性问题)中. (8认同)

sky*_*yel 17

它不便携.*envp[]是一种传统的UNIX,并非所有现代UNIX系统都实现它.

另外作为旁注,您可以通过执行指针遍历来访问envp *argv[],溢出它...但我不认为这可以被认为是安全的编程.如果你看一下过程存储器映射,你会看到envp[]它就在上面argv[].

  • 你也可以过去环境并检查`auxv` ... ;-) (3认同)

pmg*_*pmg 14

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

一个) int main(void)

b)int main(int argc, char **argv)或同等学历

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

c)或以某种其他实现定义的方式.

  • 实现_may_为`main`提供了更多格式,但这两个是唯一保证存在于任何托管实现中的格式. (6认同)

小智 6

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

Visual Studio 2015:主要参数

GNU C编程教程:环境变量