c - C 相邻堆栈寻址
问题描述
C 编译器是否对元素在 c 堆栈上的放置提供任何保证,以便a[3]
在int a[2];
执行 a 时访问,int b[2];
例如:
int a[2];
int b[2];
a[3];
提供对 b[1] 的访问;但是通过使用“a”?
解决方案
堆栈上局部变量的顺序完全取决于实现,并且实际上可以在添加或删除更多变量或更改编译器设置时更改。
例如:
#include <stdio.h>
int main()
{
int x;
char y;
double z;
printf("&x=%p\n", (void *)&x);
printf("&y=%p\n", (void *)&y);
printf("&z=%p\n", (void *)&z);
return 0;
}
在 gcc 上编译时-O0
:
&x=0x7ffd15fa27ec
&y=0x7ffd15fa27eb
&z=0x7ffd15fa27e0
z
是首先,然后y
,然后x
:
编译时-O3
:
&x=0x7ffd87f4a4c4
&y=0x7ffd87f4a4c3
&z=0x7ffd87f4a4c8
y
是首先,然后x
,然后z
:
因此,即使在同一个编译器上,它也可能会有所不同。
推荐阅读
- java - 你能“克隆”一个java SecureRandom 对象吗?- 如何获得可克隆的强RNG?
- ruby - Github Pages 分享按钮 jekyll
- python - Python-用字符串替换存储在csv文件中的日期
- php - the_content 导致不必要的空格
- javascript - 自动将目标文件夹中的所有脚本包含在已运行的脚本中 - CS6
- php - 在没有依赖注入容器的情况下解决依赖关系
- php - 选择多个条目到数据库
- google-apps-script - 将 Active Google Sheet 保存为 excel .XLSX 到本地计算机或直接保存到 OneDrive 上的特定文件夹
- ansible - 如何将单个数字传递给下一个命令
- encryption - 是否可以在 IPsec/L2TP 隧道内计算身份验证密钥?