c语言编译系统是否检查越界,C语言编译器不检查数组下标越界
这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)
例:
1 #include
2 #include
3
4 //int A[5]={0};
5 intmain()6 {7 int A[5]={0};8 //int *A=(int*)calloc(5,sizeof(int));
9 for(int i=0;i<8;++i)10 {11 //A[i]=1;
12 printf("%d\n",A[i]);13 }14
15 return 0;16 }
程序结果:
C语言的编译器是不检查下标越界的,以前知道这个问题,可是没有想过是什么原因?
总结如下:
1,不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降,所以为了程序的运行效率,C/C++才不检查下标是否越界。
2,不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并没有包含该数组长度的信息,只包含地址信息,所以语言本身无法检查,只能通过编译器检查,而早期的C语言编译器也不对数组越界进行检查,只能由程序员自己检查确保。以及在早期的CRT函数中也不对字符串指针或数组进行越界检查,都是要求程序员确保空间足够,因此也才也才有了在VS2005之后微软提供的安全的CRT函数版本。
自己写了一段检测程序测试这个问题,发现如果数组下标越界了,那么它会自动接着那块内存往后写。想了一下明白了,以前说不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。也就是说如果界外的空间暂时没有被利用,那么我们可以占用那块内存,但是如果之前界外的内存已经存放了东西,那么我们越界过去就会覆盖那块内存,导致错误的产生。。。
这样就明白了,所以我们还是需要好好规划数组的下标滴。
C语言好像没有直接取得数组长度的函数,只有取得数组所占内存大小,再除以一个元素占用的内存大小来计算数组长度。
1 int a[8];2 printf("%d",sizeof(a)/sizeof(a[0]));
c语言编译系统是否检查越界,C语言编译器不检查数组下标越界相关推荐
- linux怎么检查越界,C语言指针越界访问示例
C语言对数组下标不做检查,指针常常越界访问:我们编程时要特别注意. 一.示范代码 #include #include int a[10]; int b[10]; void main() { memse ...
- C语言怎样判断乘法越界,c语言算术运算符越界问题解决方案
大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必 ...
- C语言编译器不检查数组下标越界
这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以 ...
- C语言基础知识入门和C语言入门基础知识大全
一.C语言基础知识入门 C语言一出现,就以其丰富的功能.强大的表达能力.灵活性.方便性和广泛的应用,在世界范围内迅速普及和普及.C语言不仅高效而且可移植.它可以用来开发应用软件.驱动程序.操作系统等. ...
- c语言既适合于开发,C语言试题及答案 (1)
C语言试题及答案 (1) 文章<C语言试题及答案 (1)>是由[作文仓库]的会员[我这么冷你怕不怕]为大家整理并分享的,仅供大家参考,欢迎阅读! 第1章 C语言概述习题 1. 单项选择题 ...
- C语言13567星号如何输出,c语言程序编程心得
c语言程序设计 本课介绍c语言程序设计的基本方法和基本的程序语句. 从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构.分支结构.循环结构.这三种基本结构可以组成所有的各种复杂程序.c语言提供 ...
- 单片机c语言 i%3c%3c1,单片机C语言作业及上机习题及答案
<单片机C语言作业及上机习题及答案>由会员分享,可在线阅读,更多相关<单片机C语言作业及上机习题及答案(37页珍藏版)>请在人人文库网上搜索. 1.第一次课熟悉winTC编译环 ...
- 谭浩强c语言规范化的指数形式,C语言程序设计谭浩强第四期末复习重点.docx
1. 1.问题分析2.设计算法3.编写程序4.对源程序进行编辑.编译和连接5.运行程序,分析结 6.编写程序文档 第一章程 序 设 计 和C 语 言 1.1.什么是计算机程序 程序:一组计算机能识别和 ...
- C 语言还值得学习吗?C 语言会过时吗?C 语言解惑
C 语言还值得学吗? 答案是肯定的. 第一,学习C有助于更好的理解C++,Java,C#,Perl以及其他基于C的特性的语言.第一开始就学习其他语言的程序员往往不能很好的掌握继承自C语言的基本特性. ...
最新文章
- 高校选课成绩管理系统
- NoHttpResponseException
- SRS流媒体服务器——单机环境搭建和源码目录介绍
- Enable trace in Resale Order application
- .NET Core授权失败如何自定义响应信息?
- Android学习——ListView的缓存机制
- python实现手机号归属地相关信息查询
- oracle中的case when then else end 用法
- Pulling without specifying how to reconcile divergent branches is discouraged.
- 推荐几个在线SQL编程的网站,良心!
- 游戏辅助原理与制作02-植物大战僵尸02-金币基址
- latex特殊字体咋打?+下标打在左边
- ZNS : 解决传统SSD问题的高性能存储栈设计(fs-->io-->device)
- 使用开源激光SLAM方案LIO-SAM运行KITTI数据集,如有用,请评论雷锋
- 《Unix Linux 大学教程》 - 附录F
- 《金蝶ERP-K/3完全使用详解》——6.2 产品预测单
- CSharp中集合与字典Contains效率差别
- 生鲜电商平台-优惠券设计与架构
- 编程时java找不到文件_java.io.FileNotFoundException:系统找不到指定的文件
- Openstack“T版“全组件手动部署