2013-02-08 2 views
0

Я пытаюсь написать свою собственную версию getenv. Я еще не начал, поэтому сначала пытаюсь понять окружающую среду.Может ли кто-нибудь объяснить мне, как переменная среды работает на C++?

Если это глобальный вопрос, почему я не могу напечатать его в своей функции? Является ли среда строкой или массивом символов? Почему среда является двойным указателем? Спасибо.

#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"); 
} 

ответ

2

environ является char**. Он указывает на массив из char*, каждый из которых указывает на строку char. Так что это похоже на массив строк. Например, environ[0] - строка с нулевым завершением. Попробуйте напечатать, что:

std::cout << environ[0]; 

Каждая строка представляет собой переменную окружения формы name=value. Они соответствуют переменным среды для текущего процесса.

Однако environ не является особенностью C++ и не переносится. Он исходит из заголовка unistd.h, который определяется POSIX.

0

Просто добавьте;

Является ли среда строкой или массивом символов? Почему среда является двойным указателем?

Окружающая среда адресует массив указателей, каждый из которых указывает на первый адрес символьной строки. Окружающая среда не является одной строкой, это куча строк (ну, среда может быть пуста, так что «связка» может быть равна нулю).

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 от земли или хуже, оперативная память.

Я процитировал первый и второй, так как нет определенных правил относительно того, как упорядочиваются строки имен среды (не ожидайте, что имена будут в алфавитном порядке, например).