C/C++培训
达内IT学院
400-996-5531
各位,相信你们对数组的使用已经再熟悉不过了,不过大家有没有想过数组使用的越界问题,换句话说,C对数组的长度范围会进行检查吗?
答案是不会。因此当向数组越界写入数据的时候,经常产生“内存被破坏”的问题。如果在较早的阶段,操作系统发现异常并且提示Segmentationfault,或者“强制关闭异常的应用程序”。但此时相邻变量的值已经被破坏,程序却还在继续运行,那后果就不可想象了。既然这样,为什么C标准还是不会去检查呢?
有人说频繁地进行范围检查会影响效率,但至少应该让我们在编译的时候可以使用一个选项,以便要求编译器在调试模式下编译程序的时候,帮我们实施数组下标范围的检查。有这样的想法的人,不只是我一个吧。但是,请稍微再想一想这个问题。
对于C来说,当数组出现在表达式中的时候,它会立刻被解读成指针。此外,使用其他的指针变量也可以指向数组的任意元素,并且这个指针可以随意进行加减运算。引用数组元素的时候,虽然你可以写成a[i],但是它只不过是*(a+i)的一种表达。
还有,当你向一个函数传递数组的时候,实际上你传递的是一个指向初始元素的指针。如果这个函数还存在于其他的代码文件中(另外一个编译单元),那么通过编译器是不可能追踪到数组的。要求这样的语言在编译时生成检查数组长度的代码,是不是有些强人所难?
其实如果你一定要进行数组长度检查,可以考虑将指针封装成结构体那样,运行时让指针自身持有可取值范围的信息。可是这么做对性能的影响很大,同时,也丧失了非调试模式下编译后的库和指针的兼容性。
因此C不会对数组进行越界检查,实际上,除了某些解释型的编程语言之外,目前几乎没有编译器可以为我们做数组的越界检查。这就对我们写代码的提出了一些要求,那大家以后就要注意了!
文章来源:薛定谔的黑白猫,版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved