c - 为什么在增加的内存位置中没有连续定义的变量?
问题描述
如果我们采用以下代码:
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
. 为什么呢?
解决方案
他们没有理由这样做,所以编译器会做最适合自己的事情。
复杂的编译器优化和高效的线性内存布局并不能同时进行,因此牺牲了线性内存布局。
当您学习哈希表时,您将了解最有效的算法如何导致可重复的伪随机输出顺序。编译时将符号名称加载到哈希表中;并且函数内存空间可以通过迭代全局符号表来布局,因此它是任意顺序的。
一般来说,你会发现这是真的。每当没有指定顺序时,它就会下降,而当算法不平凡时,它就不再简单了。
永远不要依赖内存布局中的符号顺序。这不被允许。
推荐阅读
- linker - 我如何清除这个问题?无法编译?
- javascript - Jquery表单未提交
- python - 熊猫等于数据框的所有列名
- bash - 命令替换中的bash逻辑
- c# - Visual Studio for Mac:隐藏应用程序输出中的 DLL 加载
- docusaurus - 在 Docusarus 中挂钩 React Router 事件?
- ios - SwiftUI | 警告:绑定首选项 _ 尝试每帧更新多次。可能的原因?
- python - python程序中的运行时错误将中缀转换为后缀
- javascript - reactjs不能合并两个pdf
- ios - 如何在 macbook pro big sur 上安装 expo CLI?