首页 > 解决方案 > 为什么在增加的内存位置中没有连续定义的变量?

问题描述

如果我们采用以下代码:

int height = 10;
int width = 5;
printf(
    "The memory address of height is: %p\n"
    "The memory address of width is:  %p\n",
    &height, &width
);

我得到以下打印:

The memory address of height is: 0x7ffeed809a78
The memory address of width is:  0x7ffeed809a74

我期待宽度在 location 0x7ffee8843a7c。换句话说,它正在做&height - 1而不是&height + 1. 为什么呢?

标签: cpointers

解决方案


他们没有理由这样做,所以编译器会做最适合自己的事情。

复杂的编译器优化和高效的线性内存布局并不能同时进行,因此牺牲了线性内存布局。

当您学习哈希表时,您将了解最有效的算法如何导致可重复的伪随机输出顺序。编译时将符号名称加载到哈希表中;并且函数内存空间可以通过迭代全局符号表来布局,因此它是任意顺序的。

一般来说,你会发现这是真的。每当没有指定顺序时,它就会下降,而当算法不平凡时,它就不再简单了。

永远不要依赖内存布局中的符号顺序。这不被允许。


推荐阅读