【发布时间】:2012-10-04 05:35:43
【问题描述】:
你好,我的一个朋友向我展示了这段代码来说明数组/堆栈边界检查。
#include <stdio.h>
void foo() {
unsigned long long a[1];
a[3] -= 5;
printf("Print me!\n");
}
int main(){
foo();
return 0;
}
当我运行这段代码时,它一直在打印“打印我!\n”,它就是不会停止。我已经用 MingW 64 位编译了代码。这里发生了什么事?我想请人解释一下,为什么它一直在打印文本。
【问题讨论】:
-
不,它不会导致不停打印!
-
未定义的行为意味着 - 行为是未定义的。任何事情都有可能发生。
-
它改变了栈上的返回地址。值 5 很重要,因为这是 CALL 机器代码指令的长度。所以当函数返回时,它会跳回函数调用。像这样的黑客通常不会很好地复制。
-
@Raj 也许它取决于编译器......我已经用 MingW 64bit 编译了它。
-
@Amas,未定义的行为几乎肯定取决于编译器。事实上,它甚至可能取决于每次编译甚至每次运行生成的二进制文件。