使用C语言进行数组上限检查

时间:2014-08-09 17:41:58

标签: c arrays

在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]);
} 

3 个答案:

答案 0 :(得分:7)

因为C不进行任何数组边界检查。作为程序员,您有责任确保不要将索引编入索引。

根据所使用的编译器和运行代码的系统,您可能会从内存中读取随机数据,或者在读取/写出越界时最终获取SIGSEGV。

答案 1 :(得分:3)

C编译器和运行时不需要执行任何数组边界检查。

您所描述的是导致undefined behavior的整类编程错误的示例。来自维基百科:

  

在计算机编程中,未定义的行为是指其行为被指定为任意的计算机代码。

这意味着程序可以以任何方式行为不当(或不会)。

实际上,当您在数组末尾写入时,很可能会发生以下任何一种情况:

  • 程序会立即崩溃或稍后崩溃。
  • 其他无关的数据被覆盖。这可能导致任意的不当行为和/或严重的security vulnerabilities
  • 用于跟踪已分配内存的内部数据结构因越界写入而被破坏。
  • 程序的工作原理就像首先分配了更多的内存一样(内存通常是在块中分配的,幸运的是在阵列结束后可能会有一些备用容量)。

(这不是一个详尽的清单。)

有一些工具,例如Valgrid,可以帮助发现和诊断此类错误。

答案 2 :(得分:1)

C语言标准没有规定如何在内存中分配变量。

所以理论上的答案是你正在执行不安全的内存访问操作,这将导致未定义的行为(任何事情都可能发生)。

但从技术上讲,所有编译器都在堆栈中分配局部变量,在数据段中分配全局变量,所以实际答案是:

  • 对于本地数组,您将覆盖其他一些本地变量或执行非法的内存访问操作。

  • 对于全局数组,您将覆盖其他一些全局变量或执行非法内存访问操作。