0

我正在尝试编写自己的 getenv 版本。我还没有开始,所以我想先了解环境。

如果它是全局的,为什么我不能在我的函数中打印它?environ 是字符串还是字符数组?为什么环境是双指针?谢谢你。

#include <iostream>
#include <string>
#include <stdlib.h>
void myenv(char*);

void myenv(char* name)
{
std::cout<<environ;
}

int main(int argc, char** argv, char** environ)
{
myenv("PATH");
}
4

3 回答 3

2

environ是一个char**。它指向一个数组char*,每个数组都指向一个字符串char。所以它就像一个字符串数组。例如,environ[0]是以 null 结尾的字符串。尝试打印出:

std::cout << environ[0];

每个字符串都是一个形式为 的环境变量name=value。它们对应于当前进程的环境变量。

但是,environ它不是 C++ 的一个特性,并且是不可移植的。它来自unistd.hPOSIX 定义的标头。

于 2013-02-08T19:41:33.857 回答
1

char **包含环境。变量

extern char **environ;

http://pubs.opengroup.org/onlinepubs/007908799/xsh/environ.html

于 2013-02-08T19:39:18.863 回答
0

只需添加;

environ 是字符串还是字符数组?为什么环境是双指针?

environ 寻址一个指针数组,每个指针都指向字符串的第一个地址。环境不是一个字符串,而是一堆字符串(嗯,环境可以是空的,所以“bunch”可以为零)。

environ[0] contains a pointer to the 'first' environment variable.
environ[1] contains a pointer to the 'second'.

environ[0][0] would reference the first character of the 'first' name in the environment.
environ[1][0] would reference the first character of the 'second' name.

或者,如果没有至少两个环境变量,则 environ[1] 指向 segfault 区域或更糟的是 random memory

我引用了第一和第二,因为没有关于环境名称字符串如何排序的定义规则(例如,不要期望名称是按字母顺序排列的)。

于 2013-02-08T20:17:33.900 回答