在c程序中,我们可以初始化像int array[10]
这样的数组。所以它可以存储10个整数值。但是当我使用循环输入时,输入超过10并且不显示任何错误。
实际上发生了什么?
#include<stdio.H>
main()
{
int array[10],i;
for(i=0;i<=11;i++)
scanf("%d",&array[i]);
for(i=0;i<10;i++)
printf("%d",array[i]);
}
答案 0 :(得分:7)
因为C不进行任何数组边界检查。作为程序员,您有责任确保不要将索引编入索引。
根据所使用的编译器和运行代码的系统,您可能会从内存中读取随机数据,或者在读取/写出越界时最终获取SIGSEGV。
答案 1 :(得分:3)
C编译器和运行时不需要执行任何数组边界检查。
您所描述的是导致undefined behavior的整类编程错误的示例。来自维基百科:
在计算机编程中,未定义的行为是指其行为被指定为任意的计算机代码。
这意味着程序可以以任何方式行为不当(或不会)。
实际上,当您在数组末尾写入时,很可能会发生以下任何一种情况:
(这不是一个详尽的清单。)
有一些工具,例如Valgrid,可以帮助发现和诊断此类错误。
答案 2 :(得分:1)
C语言标准没有规定如何在内存中分配变量。
所以理论上的答案是你正在执行不安全的内存访问操作,这将导致未定义的行为(任何事情都可能发生)。
但从技术上讲,所有编译器都在堆栈中分配局部变量,在数据段中分配全局变量,所以实际答案是:
对于本地数组,您将覆盖其他一些本地变量或执行非法的内存访问操作。
对于全局数组,您将覆盖其他一些全局变量或执行非法内存访问操作。