【问题标题】:Why does the memory address change every time I run the same print statement? [duplicate]为什么每次运行相同的打印语句时内存地址都会改变? [复制]
【发布时间】:2021-12-28 02:57:51
【问题描述】:

每次我运行完全相同的语句时,我都会在我的 C 程序中获得不同的内存位置。这不应该永远改变吗?是的,如果我将 &p 更改为 &x,它仍然会发生。我意识到这两个应该是不同的,但是当我重复运行(不编译)程序以查看它的内存地址时会发生这种情况。

#include <stdio.h>
#include <string.h>


int main()
{
  int x = 30;
  int* p;
  p = &x;
  
  printf("%p \n", &p);
}

Proof

【问题讨论】:

  • 为什么你认为它不应该改变
  • 仅供参考,鉴于 printf 参数列表,int x 声明和 p = 声明都是毫无意义的;您正在打印指针变量p 的地址,而不是指针变量p 中保存的地址within。你真的应该包括你声称你得到的重复样本输出。
  • @alex01011 我被告知你为变量指定的内存地址永远不会改变。计算机还能如何使用指针?
  • whozcraig,是的,我故意这样做是为了检查 p 作为指针保存的地址是否发生变化。确实如此。此外,您必须单击证明才能查看我包含的 repitition 的图像。
  • 011c 谢谢,这正是我想要的。

标签: c pointers memory


【解决方案1】:

为什么每次运行时内存地址都会改变

因为您的系统使用address space layout randomization (ASLR),特别是随机堆栈放置。

在 Linux 上,您可以像这样为单个进程禁用 ASLR:

setarch -R ./a.out

在 GDB 下运行程序也会默认禁用 ASLR。

有人告诉我,你为变量指定的内存地址永远不会改变。

堆栈变量的地址实际上永远不会改变在你的程序的特定执行期间。它只能在不同的运行之间改变。

【讨论】:

  • 谢谢俄语,这就是我正在寻找的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多