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

所以,我刚研究了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 ++编译器。

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

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

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

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

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

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

你在这做什么叫做Undefined Behavior 。 超出数组索引时,它不会显示错误。

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


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

C不执行数组边界检查。

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

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

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