C 语言中编译器为何不检测数组下标越界问题

如题所述

以前还真没想过,记得老师讲的时候也没说,就是强调这是C语言的历史问题,从一开始就没有,后来这个功能也没有加上。至于具体的原因已知模棱两可,今天总算查清楚了。综合网上的各种资料,可以得到如下的结果:1. 在一个固定的机器之下,指针所占的位数都是一样的,换言之,保存的地址是有最大值的,这样如果每次都检查数组的越界问题,会对指针的功能做出很大的限制,因为指针只是包含地址信息并没有包含长度的信息,比如一个char ch[100];char * test=ch;之后test也可以只想超过100的长度的字符串类型,并不是局限与100。如果检测长度,那么就相当与限制的指针的长度,这是不合理的。2. 没有效率,需要付出代价。具体:最早的C编译器并不检查下标,而最新的编译器依然不对它进行检查。这项任务之所以很困难,是因为下标引用可以作为任意的指针,而不仅仅是数组名。作用于指针的下标引用的有效性既依赖于该指针当时恰好指向什么内容,也依赖于下标的值。结果,C的下标检查所涉及的开销比你开始想象的要多。编译器必须在程序中插入指令,证实下标的结果所引用的元素和指针表达式所指向的元素属于同一个数组。这个比较操作需要程序中所有数组的位置和长度方面的信息,这将占用一些空间。当程序运行时,这些信息必须进行更新,以反映自动和动态分配的数组,这又将占用一定的时间。因此,即使是那些提供了下标检查的编译器通常也会提供一些开关,允许你去掉下标检查。
温馨提示:答案为网友推荐,仅供参考
相似回答