【发布时间】:2015-12-07 23:12:13
【问题描述】:
我写了一个C代码:
#include <stdio.h>
int main()
{
int i;
int a[4];
for( i =0;i<5;i++)
{
a[i]=i;
printf("a[%d]:%d ",i,a[i]);
}
return 0;
}
我用gcc编译并成功运行,结果是:
a[0]:0 a[1]:1 a[2]:2 a[3]:3 a[4]:4
但是你可以看到数组 a 的大小为 4,从 0 到 3,我没有创建额外的内存来引用 a[4],并且意外地它运行并且似乎没有错误。在 Java,我查找数组的索引是否超出范围,它会抛出异常。我只是不知道为什么在 C 语言中它运行得很好。
【问题讨论】:
-
请参阅Is accessing a global array outside its bound undefined behavior?,具体情况略有不同,但答案涵盖了所有相同的基础,一个对这个问题的回答。
-
因为 C 没有对数组进行边界检查。当写信给
a[4]时,你只是在写内存中的某个地方。如果你幸运的话,你会得到一个Segfault,它会告诉你内存有问题。在大多数情况下,您只是破坏了那里的所有数据(它可能会在您的应用程序后期产生影响......然后“快乐调试”)。 -
@ShafikYaghmour
a[4]在这种情况下不是全局的! -
@HappyCoder 是的,这就是为什么我说细节略有不同,但答案非常完整,对此的完整答案将涵盖几乎所有相同的领域。
-
想想 undefined 的含义,就像在 undefined behavior 中一样。 (这就是您要调用的内容)。