【问题标题】:Why is there a difference in memory address of environment variable when running a program为什么运行程序时环境变量的内存地址有差异
【发布时间】:2009-07-09 09:10:25
【问题描述】:

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

更准确地说:

./test PATH --> 0xbffffd96

在 gdb 中调试 --> 0xbffffd53

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

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

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

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

【问题讨论】:

    标签: memory location


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      也许你想做?

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

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

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

      例如,

      echo $PATH
      

      给我,

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

      我对@9​​87654324@ 的所有编程兴趣都在于它的内容,而不是任何类型的地址。

      【讨论】:

      • 在缺少括号中编辑。
      【解决方案3】:

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

      【讨论】:

      • 对不起,我的模棱两可的例子。在我的程序中应该有这样的东西:例如 printf("%p",getenv("PATH"))
      • 您的问题并不含糊。我知道你问的是内存地址(“%p”)。然而,正如其他人所说,你不应该关心这个。
      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 2012-12-29
      • 2023-03-05
      相关资源
      最近更新 更多