我对这个关于循环的奥秘深陷其中。

    int abc[3], i, j;
    for(j=0; j<3; j++);
    printf("%d\n", j);
    abc[j] = abc[j] + 3;
    printf("%d \n", j);


Output:

3
6


输出应该是3,3,因为我没有更改j的值。

在abc的第j个值上加3会使j的值改变3。这种情况仅在退出for循环然后尝试更改abc [j]的值时发生。

也许我缺少一些显而易见的东西。任何帮助将非常感激。

最佳答案

因为您声明数组的大小为3 int abc[3];,但是您正在索引第4个元素,因此缓冲区溢出。这是未定义的行为。

abc[j] = abc[j] + 3; // j = 3 here, overflow


您最有可能看到的是j位于堆栈上,位于数组abc的后面,因此,当您使用abc[3]溢出数组后,实际上是在修改包含j的内存。

*请注意,在C标准中,没有任何地方提到单词堆栈,这是一个实现细节,并且可能因系统而异。这部分是为什么它是“未定义的行为”的原因,并且您收到人们的答复,即他们认为两个3是输出。

关于c - 关于循环的奥秘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4859827/

10-12 04:15
查看更多