2009-07-09 16 views
2

我編寫一個C程序獲取一個環境變量的名字並打印出它的內存地址,只需使用getenv()函數來完成這項工作。假設我想要PATH的地址位置 - > ./test PATH。但是,當我在gdb中調試該程序時,該變量的內存位置不同。你能詳細解釋爲什麼會有這樣的不同?爲什麼運行程序時環境變量的內存地址有所不同

更確切地說:

./test PATH - > 0xbffffd96

調試在gdb - > 0xbffffd53

[編輯]謝謝你的解釋。我真正質疑的是,變量的內存地址(在本例中是一個環境變量)如何隨着不同的程序而改變。例如,我有2個程序a.out,並B.OUT

./a.out - > PATH的地址是一些數字

./b.out - >另一個號碼

那麼,是什麼原因導致2號之間的差異?我希望我已經清楚地表明我想問什麼。感謝隊友。

回答

1

爲什麼你會期望它每次都返回相同的內存位置? getenv返回「指向包含指定名稱的值的字符串的指針。」它沒有指定哪個字符串位於的內存位置,也不是該位置是否將被覆蓋。

+0

對不起,我的模糊的例子。在我的程序中應該是這樣的:printf(「%p」,getenv(「PATH」))例如 – wakandan 2009-07-09 09:45:29

+0

您的問題並不含糊。我明白你問的是內存地址(「%p」)。但是,正如其他人所說,你不應該在意這一點。 – 2009-07-09 11:57:08

4

通常,環境變量是某些「過程數據塊」的一部分,並且這些變量是從啓動過程繼承的。如果您在調試器中運行程序,該調試器將擁有自己的進程數據塊,並且程序將從調試器繼承其進程數據塊。這又可能繼承了IDE的程序數據塊。

無論如何,這並不重要,因爲環境變量的接口不會給你那種細節。例如,在Windows上,很有可能環境變量將在您請求它們時從Unicode轉換爲本地8位代碼頁。你永遠不會看到原始變量,只是(近似值)。

3

也許你想要做什麼?

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

獲取環境變量字符串確實纔有意義。
但是,系統給你的字符串的地址,在任何地方都沒有相關性
(特別是在這個程序的範圍之外)。

您應該對環境字符串值而不是地址感興趣。
如果您有任何理由使用該地址,請在此提供。

例如,

echo $PATH 

給我,

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

所有我與編程PATH興趣將是它的內容沒有任何類型的地址。

相關問題