我被告知这是一个有缺陷的代码,但我不知道为什么,有些人可以向我解释。 为什么编译时不会有数组超出绑定异常?
int a[10];
int j;
void main () {
int i, j = 42;
for (i = 0; i <=10; i++) a[i] = i;
printf("%d", j);
}
答案 0 :(得分:27)
你已经分配了10个空格。你填11。
答案 1 :(得分:6)
更改
int a[10];
到
int a[11];
或
for (i = 0; i <=10; i++) a[i] = i;
到
for (i = 0; i < 10; i++) a[i] = i;
您创建了一个计数为10的数组,并尝试在其中放入11个元素。你要么只需要放10个元素,要么创建一个更大的数组。
答案 2 :(得分:1)
这是一个错误:
void main () {
应该是
int main (int argc, char** argv) {
你的循环中还有另一个错误。你写过数组a
的末尾,如果你的编译器在j
之后立即将a
放在内存中(基于你的问题,我认为它确实如此),那么bounds数组访问实际上最终会将值赋给j
。因此,当您将10
写入a[10]
(不存在)时,您将其写入j
所在的内存中(导致此操作像j = 10
) 。但是,这种行为取决于编译器如何在内存中布置变量,因此如果您在不同的平台上编译相同的程序,您可能会看到不同的行为。
答案 3 :(得分:1)
填充跨越边界的阵列...... [10]是错误的。
答案 4 :(得分:-2)
不应该有数组溢出,这正如你在问题中提到的那样正确。但是一些编译器会给出代码的PASS,而其他编译器会触发警告(或错误提升)。