C语言编译器不检查数组下标越界 困扰的很长时间

编程知识 行业动态 更新时间:2024-06-13 00:22:39

C语言的编译器是不检查下标越界的,以前知道这个问题,可是没有想过是什么原因?

 总结如下:
  1,不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降,所以为了程序的运行效率,C/C++才不检查下标是否越界。
  2,不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并没有包含该数组长度的信息,只包含地址信息,所以语言本身无法检查,只能通过编译器检查,而早期的C语言编译器也不对数组越界进行检查,只能由程序员自己检查确保。以及在早期的CRT函数中也不对字符串指针或数组进行越界检查,都是要求程序员确保空间足够,因此也才也才有了在VS2005之后微软提供的安全的CRT函数版本。  

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

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

C语言好像没有直接取得数组长度的函数,只有取得数组所占内存大小,再除以一个元素占用的内存大小来计算数组长度。

int a[8];
printf("%d",sizeof(a)/sizeof(a[0]));



更多推荐

C语言编译器不检查数组下标越界 困扰的很长时间

本文发布于:2023-04-02 21:58:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/676272c1392f807e4ae479a77dbfce0b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:下标   编译器   数组   很长时间   困扰

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!