在C语言中,我注意到我可以写入 static 数组禁区,例如:
static char a[10] = {0};
for (int i=0; i<20; i++) {
a[i] = 'a'; // Should fail when i > 9
}
我预计会出现细分错误,但执行起来很好。
如果将静态数组分配在堆栈上,这是有道理的,但是没有意义,那为什么会这样呢?
注意:静态int数组的行为类似。没有检查其他类型。
谢谢。
编辑:由于其他问题与 static 数组无关,因此这不是重复的。与“常规”数组不同,静态数组是在BSS中分配的。行为可能有所不同,这就是为什么我要分别询问。
答案 0 :(得分:2)
仅当您实际尝试写入内存时才会遇到分段错误 那是非法地址。您的示例代码写的内容超出了为数组分配的内容,但这并不是操作系统认为合法使用的地址。 即使您没有遇到分段错误,您的示例代码也可能破坏代码中的其他数据结构,并导致程序的主要错误行为,甚至更糟的是,它可能导致间歇性错误行为并且难以调试。