我有这段代码,它运行得很好,但我不知道为什么:
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)
输出“可以”。这确实是一件很糟糕的事情。
为了提高效率,C 编译器通常不会生成检查数组边界的代码。越界数组访问会导致“未定义的行为”,而一种可能的结果是“它有效”。它不能保证导致崩溃或其他诊断,但如果您使用的是支持虚拟内存的操作系统,并且您的数组索引指向尚未映射到物理内存的虚拟内存位置,则您的程序会更有效。可能会崩溃。