广州C/C++培训
达内广州岗顶中心

18087159764

热门课程

C语言的编译器为什么不检查数组下标越界

  • 时间:2016-08-25
  • 发布:广州C++培训
  • 来源:C++技术网

今天写一个简单的两路归并排序的时候发现,c语言不对数组下标越界做出检查,但是同样的代码写在java里面,不断的抛出下标越界的异常,到底为什么c语言不去检查这个呢?查了资料后明白了。

1、不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降,所以为了程序的运行效率,C/C++才不检查下标是否越界。

2、不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并没有包含该数组长度的信息,只包含地址信息,所以语言本身无法检查,只能通过编译器检查,而早期的C语言编译器也不对数组越界进行检查,只能由程序员自己检查确保。以及在早期的CRT函数中也不对字符串指针或数组进行越界检查,都是要求程序员确保空间足够,因此也才也才有了在VS2005之后微软提供的安全的CRT函数版本。

自己写了一段检测程序测试这个问题,发现如果数组下标越界了,那么它会自动接着那块内存往后写。想了一下明白了,以前说不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。也就是说如果界外的空间暂时没有被利用,那么我们可以占用那块内存,但是如果之前界外的内存已经存放了东西,那么我们越界过去就会覆盖那块内存,导致错误的产生。。。

这样就明白了,所以我们还是需要好好规划数组的下标滴。

上一篇:数组指针 int (*p)[n]和指针数组 int *p[n]区别
下一篇:atoi接口实现方法,自己实现atoi函数功能

马云做新花样:分享经济社区

苏宁拟减持阿里550万股

苹果市值超过1万亿美元,预计2018年场景

双11新防止短信受骗

选择城市和中心
贵州省

广西省

海南省