Ale*_*ele -3 c stack memory-management
下面的代码片段是故意访问下面的下一个sizeof(int)字节t[4],所以我知道这里犯的错误.我只是作为一个实验来看看编译器如何处理堆栈分配.
int t[5], i;
for (i = 0; i <= 5; i++) {
t[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上执行此代码时,使用GNU C编译器的移植版本,程序总是陷入无限循环.我确信这只会发生,因为t并且i在堆栈上依次分配并t[5]指向与i变量相同的地址.因此,当执行t[5] = 0程序时实际将值设置i为零.
但是,当使用不同版本的GNU C编译器编译它时,我永远不会得到无限循环.地址t[5]与地址不同i.
我的问题是,为什么这种行为不同?我知道你不应该假设这个结果,但是不是堆栈分配应该以同样的方式发生吗?
我真正好奇的是编译器如何管理这些堆栈分配.有填充物吗?订单总是与源代码中的相同吗?显然,这与C标准无关,实现之间存在差异,甚至同一编译器的不同版本也存在差异.我很好奇,尽管在这种特殊情况下可能的结果和考虑因素是什么.
您正在处理未定义的行为.编译器不需要按顺序布局自动变量(因为它们出现在源代码中).其中一些可能在寄存器中,或者它们可能以不同的方式订购,例如,如果较小的偏移更便宜.
这种要求仅存在于结构的成员(其中成员之间具有任意填充).
有填充物吗?
是的,编译器会遵守每种类型的对齐要求并相应地放置变量.
订单总是与源代码中的相同吗?
不,但这是许多漏洞依赖的东西.缓冲区溢出可能会覆盖相邻变量并危及整个程序的执行.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |