为什么运行程序时环境变量的内存地址存在差异

时间:2009-07-09 09:10:26

标签: memory location

我写一个C程序获取一个环境变量的名称并打印出它的内存地址,只需使用getenv()函数来完成这项工作。假设我想拥有PATH的地址位置 - > ./test PATH。但是当我在gdb中调试该程序时,该变量的内存位置是不同的。你能详细解释为什么会出现这样的不同吗?

更确切地说:

./test PATH - > 0xbffffd96

在gdb中调试 - > 0xbffffd53

[编辑]感谢您的解释。我实际上问的是,变量的内存地址(在这种情况下,环境变量)如何随着不同的程序而变化。例如,我有2个程序a.out和b.out

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

./b.out - >另一个数字

那么,两个数字之间的差异是什么原因造成的?我希望我已经清楚地证明了我想问的问题。谢谢伙伴们。

3 个答案:

答案 0 :(得分:4)

通常,环境变量是某些“过程数据块”的一部分,并且这些变量是从启动过程继承的。如果您在调试器中运行程序,该调试器将拥有自己的过程数据块,您的程序将从调试器继承其过程数据块。这反过来可能继承了IDE的程序数据块。

无论如何这都没关系,因为环境变量的接口并没有给你那种细节。例如,在Windows上,当您要求环境变量很可能会从Unicode转换为本地8位代码页。你永远不会看到原始变量,只是(近似值)它的值。

答案 1 :(得分:3)

也许你想做?

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

获取环境变量字符串 是否有意义 但是,系统为您提供字符串的地址在任何地方都没有相关性 (特别是在本计划范围之外)。

您应该对环境字符串值而不是其地址感兴趣 如果您有任何理由使用该地址,请在此处提供。

例如,

echo $PATH

给了我,

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

我对PATH的所有计划兴趣都在其内容中,而不是任何地址。

答案 2 :(得分:1)

为什么你希望它每次都返回相同的内存位置? getenv返回“指向包含指定名称值的字符串的指针。”未指定字符串所在的内存位置,以及稍后是否覆盖该位置。