C语言为什么不做数组下标越界检查?
这是C语言的历史问题,从一开始就没有,后来这个功能也没有加上。综合网上的各种资料,可以得到如下的结果:
1. 在一个固定的机器之下,指针所占的位数都是一样的,换言之,保存的地址是有最大值的,这样如果每次都检查数组的越界问题,会对指针的功能做出很大的限制,因为指针只是包含地址信息并没有包含长度的信息,比如一个
char ch[100];
char * test=ch;
之后test也可以只想超过100的长度的字符串类型,并不是局限与100。如果检测长度,那么就相当与限制的指针的长度,这是不合理的。
2. 没有效率,需要付出代价。具体:最早的C编译器并不检查下标,而最新的编译器依然不对它进行检查。这项任务之所以很困难,是因为下标引用可以作为任意的指针,而不仅仅是数组名。作用于指针的下标引用的有效性既依赖于该指针当时恰好指向什么内容,也依赖于下标的值。结果,C的下标检查所涉及的开销比你开始想象的要多。编译器必须在程序中插入指令,证实下标的结果所引用的元素和指针表达式所指向的元素属于同一个数组。这个比较操作需要程序中所有数组的位置和长度方面的信息,这将占用一些空间。当程序运行时,这些信息必须进行更新,以反映自动和动态分配的数组,这又将占用一定的时间。因此,即使是那些提供了下标检查的编译器通常也会提供一些开关,允许你去掉下标检查。
3.为了提高运行效率,不检查数组下表越界,程序就可以跑得快。因为C语言并不是一个快速开发语言,它要求开发人员保证所有逻辑的正确性。所以至少到目前为止,C语言是所有高级语言中速度最快,效率最高的。几乎所有对性能有苛刻要求的场合都使用C语言。
但是,如果越界引用,也可能会发生意想不到的情况 ,比如访问没有权限访问的内存,导致程序出错崩溃。
作者QQ4577105