为什么在增加的内存位置中没有连续定义的变量?

时间:2019-09-02 22:59:09

标签: c pointers

如果我们采用以下代码:

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

我期望宽度在位置0x7ffee8843a7c处。换句话说,它正在执行&height - 1而不是&height + 1。为什么会这样?

1 个答案:

答案 0 :(得分:2)

没有理由要求它们,所以编译器会做最适合自己的事情。

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

使用散列表时,您将了解最有效的算法如何导致可重复的伪随机输出顺序。编译时将符号名称加载到哈希表中;并且可以通过遍历全局符号表来布局功能存储空间,因此它以任意顺序排列。

通常,您会发现这是对的。每当未指定顺序时,它就会掉下来;而当算法不平凡时,它就不再简单了。

从不依赖于符号在内存布局中的顺序。不允许。