我正在运行这些代码
#include <stdio.h>
void Crash(char * cData){
cData[2] = 100;
}
int main() {
char cData[2] = {1,2};
Crash(&cData[0]);
printf("%d\n",cData[1]);
return 0;
}
我预计程序会崩溃,因为cData[2] = 100;
(Crash())会更改Crash函数的返回地址。我相信cData [1](main())旁边的内存位置保留了Crash函数的返回地址。因此,在Crash函数完成执行后,它将获取返回地址中的值(现在为100)并继续执行其他代码。所以不应该这样做会导致程序崩溃吗?
答案 0 :(得分:1)
您的程序有未定义的行为,可以是任何行为,包括根本不会发生崩溃,甚至是预期的行为。
在您的特定情况下,数组char cData[2] = {1,2};
有可能占用堆栈上的空间,该空间在其他重要信息(如返回地址或已保存的堆栈帧指针)之前填充2个额外字节。修改其中一个字节将没有明显的效果。尝试修改cData[4]
或cData[8]
等,但不要因为不良副作用而责怪我。