为什么编译器没有警告我一个明显的错误?

时间:2015-11-18 18:19:42

标签: c

所以,我刚研究了 Arrays 材料并遇到了问题...... 我得到以下代码:

int a[5]; 
int i;
for(i=0; i<=10; i++) {
    scanf("%d", &a[i]);
}

我在一个数组上声明它的长度为5。
然后,我运行了一个从0到10的for循环,将数字插入a[i] 我用这个表(我创建的)来了解执行期间发生的事情:

你看到红色箭头?这就是她停止循环的地方,因为他们a[]无法获得超过5个值。这意味着a[6]不存在。
即使它不断询问数字,并继续将它们保存到阵列中。

还有一件事,我目前正在使用 Dev C ++ 编译器。

有谁知道为什么会这样?
谢谢!

5 个答案:

答案 0 :(得分:5)

C对数组索引超出约束检查的约束没有任何标准。

这意味着程序可以自由地违反索引规则。程序员可以检查数组索引约束。

并且,这将导致未定义的行为。

答案 1 :(得分:2)

此错误与编译器无关。无论是C还是Java,只要它不违反语言语法和语义,代码就会编译。

您所拥有的是一个逻辑错误,可以通过语言运行时环境检测到,例如: JVM,这是C所缺乏的。

答案 2 :(得分:1)

您在此处所做的工作称为未定义的行为。当你超越数组的索引时,它不会显示错误。

这意味着无法定义代码将显示的行为。

在旁注中,我想添加一些我在某处读到的东西。 请注意,这只是我读过的内容,可能是错误的,但确实有意义。C中,某些行为不会产生错误,因为C认为因为程序员足够聪明,不会犯这样的错误。

答案 3 :(得分:1)

C不执行数组边界检查。

答案 4 :(得分:1)

C不对数组访问进行任何边界检查(也就是说,如果尝试访问数组边界之外的元素,编译器将不会注入任何会引发异常的代码)。语言标准没有定义如果访问数组边界之外的项目会发生什么;当你这样做时,你的代码基本上无效。

结果可以包括从运行到完成而没有明显错误的任何内容,抛出段错误,触发恶意软件例程等等。同样,语言定义不要求对此类错误采取任何特定行为。

请记住,C是70年代早期的产物;边界检查减慢了你的速度,C哲学是程序员最有能力知道边界检查是否真的有必要。编译器假设您知道您的数组有多大,并且您知道不要尝试读取或写入它的结尾。