Char * envp []作为 main()可移植的第三个参数

为了在 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++);
}

char *envp[]是便携式的吗?

63580 次浏览

函数 getenv是 C 标准指定的唯一函数。函数 putenv和外部 environ是特定于 POSIX 的。

EDIT

POSIX 没有指定 main参数 envp,但是它受到广泛支持。

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

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

然后,可以用与 environ 相同的方式处理此参数,使用 它的作用域是 main ()的局部 在 UNIX 系统上广泛实现,因此应该避免使用它, 除了范围限制,它在 SUSv3中没有指定

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

A) int main(void)

and

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

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

C)或其他实现定义的方式。

It isn't portable. *envp[] is a traditional UNIX thing, and not all modern UNIX systems implement it.

还有一点需要注意的是,你可以通过在 *argv[]上做指针遍历来访问 envp,使其溢出... ... 但是我不认为这可以被认为是 safe编程。如果您看一下进程内存映射,您将看到 envp[]刚好在 argv[]之上。

第三个论点在 Microsoft C 和 GNU GCC 中是有效的:

VisualStudio2015: main 的参数

编程教程: 环境变量