这个C代码的错误在哪里

时间:2010-07-08 23:22:42

标签: c

我被告知这是一个有缺陷的代码,但我不知道为什么,有些人可以向我解释。 为什么编译时不会有数组超出绑定异常?

int a[10];
int j;

void main () {
    int i, j = 42;
    for (i = 0; i <=10; i++) a[i] = i;
    printf("%d", j);
}

5 个答案:

答案 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,而其他编译器会触发警告(或错误提升)。