为什么程序没有崩溃?

时间:2017-08-08 16:43:40

标签: c arrays crash

我正在运行这些代码

#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)并继续执行其他代码。所以不应该这样做会导致程序崩溃吗?

1 个答案:

答案 0 :(得分:1)

您的程序有未定义的行为,可以是任何行为,包括根本不会发生崩溃,甚至是预期的行为。

在您的特定情况下,数组char cData[2] = {1,2};有可能占用堆栈上的空间,该空间在其他重要信息(如返回地址或已保存的堆栈帧指针)之前填充2个额外字节。修改其中一个字节将没有明显的效果。尝试修改cData[4]cData[8]等,但不要因为不良副作用而责怪我。