75

为了在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[]便携吗?

4

4 回答 4

66

该函数getenv是 C 标准中唯一指定的函数。functionputenv和 externenviron是 POSIX 特定的。

编辑

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

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

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

然后可以以与 environ 相同的方式处理此参数,不同之处在于它的范围是 main() 的本地。尽管此功能在 UNIX 系统上广泛实现,但应避免使用它,因为除了范围限制外,SUSv3 中没有指定它

于 2012-04-25T18:20:19.537 回答
20

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

另外作为旁注,您可以通过指针遍历来访问 envp *argv[],使其溢出......但我认为这不能被视为安全编程。如果您查看进程内存映射,您会看到envp[]上面的内容argv[]

于 2012-04-25T18:22:23.507 回答
18

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

一种)int main(void)

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

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

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

于 2012-04-25T18:20:45.073 回答
9

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

Visual Studio 2015:主要参数

GNU C 编程教程:环境变量

于 2015-07-30T11:35:07.607 回答