2

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

更准确地说:

./test PATH --> 0xbffffd96

在 gdb 中调试 --> 0xbffffd53

[编辑] 感谢您的解释。我真正关心的是,变量(在本例中为环境变量)的内存地址如何随着不同的程序而变化。例如,我有 2 个程序 a.out 和 b.out

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

./b.out--> 另一个号码

那么,是什么导致了两个数字之间的这种差异?我希望我已经清楚地表明了我想问的问题。谢谢小伙伴。

4

3 回答 3

4

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

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

于 2009-07-09T10:00:16.403 回答
3

也许你想做?

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

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

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

例如,

echo $PATH

给我,

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

我对程序的所有兴趣PATH都在于其内容,而不是任何地址。

于 2009-07-09T10:24:27.823 回答
1

为什么您希望它每次都返回相同的内存位置?getenv 返回“指向包含指定名称值的字符串的指针”。没有指定字符串位于哪个内存位置,也没有指定以后是否会覆盖该位置。

于 2009-07-09T09:15:32.783 回答