我对这个关于循环的奥秘深陷其中。
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/