Почему существует разница в адресе памяти переменной среды при запуске программы - PullRequest
2 голосов
/ 09 июля 2009

Я пишу C-программу, получаю имя переменной среды и распечатываю ее адрес памяти, просто использую функцию getenv() для выполнения этой работы. Допустим, я хочу иметь адрес местоположения PATH -> ./test PATH. Но когда я отлаживаю эту программу в gdb, расположение этой переменной в памяти отличается. Не могли бы вы подробно объяснить, почему существует такая разница?

Точнее:

./test PATH -> 0xbffffd96

отладка в gdb -> 0xbffffd53

[править] Спасибо за ваши объяснения. На самом деле я спрашиваю о том, как адрес памяти переменной (в данном случае переменной среды) изменяется в разных программах. Например у меня 2 программы a.out и b.out

./a.out -> адрес PATH - это некоторое число

./b.out -> другой номер

Итак, что вызывает эту разницу между 2 числами? Надеюсь, я четко продемонстрировал то, что хочу спросить. Спасибо товарищи.

Ответы [ 3 ]

4 голосов
/ 09 июля 2009

Как правило, переменные среды являются частью некоторого «блока данных процесса», и они наследуются от начального процесса. Если вы запускаете программу в отладчике, у этого отладчика будет свой собственный блок данных процесса, и ваша программа унаследует свой блок данных процесса от отладчика. Это, в свою очередь, могло унаследовать программный блок данных IDE.

В любом случае это не имеет значения, потому что интерфейс к переменным окружения не дает вам таких подробностей. Например, в Windows вполне вероятно, что переменные окружения будут преобразованы из Unicode в вашу локальную 8-битную кодовую страницу, когда вы их попросите. Вы никогда не увидите исходную переменную, просто (приблизительно) ее значение.

3 голосов
/ 09 июля 2009

Возможно, вы хотите сделать?

printf("%s",getenv("PATH")); 

Получение строки переменной окружения имеет смысл .
Но адрес, по которому система выдает строку, нигде не имеет отношения
(особенно за пределами этой программы).

Вас должно интересовать строковое значение окружения, а не его адрес .
Если у вас есть причина использовать адрес, укажите это здесь.

Например,

echo $PATH

дает мне,

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: ... etc

Весь мой программный интерес с PATH был бы связан с его содержанием, а не с каким-либо адресом.

1 голос
/ 09 июля 2009

Почему вы ожидаете, что он будет каждый раз возвращать одну и ту же ячейку памяти? getenv возвращает «указатель на строку, содержащую значение для указанного имени». Не указывается , в какой ячейке памяти находится строка, и не будет ли эта ячейка позже перезаписана.

...