超出 C 中的数组界限——为什么这不会崩溃?

use*_*305 5 c arrays

我有这段代码,它运行得很好,但我不知道为什么:

int main(){
   int len = 10;
   char arr[len];
   arr[150] = 'x';
}
Run Code Online (Sandbox Code Playgroud)

说真的,尝试一下!它有效(至少在我的机器上)!但是,如果我尝试更改索引太大(例如索引 20,000)的元素,它就不起作用。所以编译器显然不够聪明,无法忽略这一行。

那么这怎么可能呢?


答案:我可以用它来写入堆栈上其他变量消耗的内存,如下所示:

#include <stdio.h>
main(){
   char b[4] = "man";
   char a[10];
   a[10] = 'c';
   puts(b);
}
Run Code Online (Sandbox Code Playgroud)

输出“可以”。这确实是一件很糟糕的事情。

Jim*_*wis 6

为了提高效率,C 编译器通常不会生成检查数组边界的代码。越界数组访问会导致“未定义的行为”,而一种可能的结果是“它有效”。它不能保证导致崩溃或其他诊断,但如果您使用的是支持虚拟内存的操作系统,并且您的数组索引指向尚未映射到物理内存的虚拟内存位置,则您的程序会更有效。可能会崩溃。