我偶然遇到了这段代码:
#include<stdio.h>
int main()
{
int i;
int array[3];
for(i=0;i<=3;i++)
array[i]=0;
return 0;
}
在运行此代码时,我的终端被挂起 - 代码没有终止。
当我3
替换2
代码成功运行并终止时没有问题。
在C中没有绑定检查数组,所以上面的代码有什么问题导致它不能终止?
平台 - Ubuntu 10.04 编译器 - gcc
答案 0 :(得分:2)
您的代码读取超出数组范围并导致未定义行为。
声明大小为3
的数组时。有效的索引范围是0
到2
您的循环从0
到3
。
如果您访问的数据超出了数组的有效范围,那么它就是未定义的行为,您的程序可能会挂起或崩溃或显示任何行为。在这种情况下,c标准并未规定任何特定行为。
当你说C不做边界检查时,它实际上意味着程序员有责任确保他们的程序不会超出分配的数组的范围,并且不能这样做导致所有安全的注意都被关闭和任何行为
答案 1 :(得分:2)
仅仅因为没有绑定检查并不意味着写出界限没有后果。这样做会调用未定义的行为,因此无法确定可能发生的情况。
这一次,在这个编译器上,在这个体系结构中,当你写入array[3]
时,你实际上将i
设置为零,因为我被定位在array
之后堆栈。
答案 2 :(得分:1)
int array[3];
这声明了一个3个整数的数组,其索引为0,1和2。
for(i=0;i<=3;i++)
array[i]=0;
这将四个整数写入数组,索引0,1,2和3.这是一个问题。
这里没有人可以确切地说出你所看到的内容 - 你甚至没有指明你正在做什么平台。我们所能说的只是代码被破坏了,这导致了你所看到的任何结果。一种可能性是我在数组之后存储,所以当你执行数组[3] = 0时,你最终将i设置回0。但这只是猜测。
答案 3 :(得分:0)
array
的最高有效索引为2
。写过该索引会调用未定义的行为。
您所看到的是未定义行为的表现。
将此与以下两个片段进行对比,两个片段都是正确的:
/* 1 */
int array[3];
for(i=0;i<3;i++) { array[i] = 0; }
/* 2 */
int array[4];
for(i=0;i<4;i++) { array[i] = 0; }
答案 4 :(得分:0)
您声明了大小为3的数组,这意味着(0,1,2是有效索引)
如果您尝试将0设置为某个不适合我们意外(通常称为 UB 未定义行为)的内存位置,则可能会发生事情
答案 5 :(得分:0)
数组中的元素编号为0到(n-1)。你的阵列有3个点,但正在初始化4个位置(0,1,2,3)。通常,你有你的循环说i&lt; 3这样你的数字就匹配了,但是你没有超过数组的上限。