数组/越界
为什么不报错
数组
在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
那什么是数组?
首先,我们应该知道数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。(下标通常从0开始算起:0、1、2、…n。)
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
在知道以上情况后,
如果我们定义了一个长度为5的数组:
int[] a = new int[5];
那么你用a[0]到a[4]都不会越界,当你的数组下标大于5时,就会数组越界。
问题来了
请看下面一个小程序
如果,在编译器上,
运行此代码。
编译器不报错&&运行成功
这个程序运行时是这个样子:
这就是一个典型的数组越界引发的问题,如果大家细心读程序观察结果,就会发现虽然str字符串的内容没有问题,但旁边的整形变量a似乎有点“抢镜”哦,原来是5,可现在竟然输出0! 再看看代码,又没有被赋值,就莫名由5改成了0!真是躺着也中枪啊!
那这里为什么a的值被更改了呢?下面我们为大家详细解释!
若要查明这个原因,大家可以跟踪内存,尤其变量a的位置便可以查明一二。
如图,函数前下断点,首先确认a的值和str的初始值:
a确认是5没有问题,由于str数组的地址我们观察到比a要小,所以内存监视这里我们更新为str的地址。
可以顺便观察str和它后面的a两个值,
如下图:
可以看到str地址处还未初始化,而a的地址为且初始化为5,没有问题!
执行下一步继续观察:
到这里,我们看到str数组已经被初始化为0(红色部分占10个字节),
注意此时的a距离str最后一个元素也就是str[9]的位置也就三个字节!
现在大家可以偷偷再数一数给str拷贝的字符串长度为12个…咳咳。
那么继续下一步,继续观察:
注意,问题来了!
这一步直接导致从处开始的13个字节全部更改,并且波及到了a的地址处,仔细观察分析内容可以看到前12个分别为3这12个数的ASC码,而第13个字节的内容则为字符串结尾的’’所致!
这就使得第13个字节处的内容也就是a的地址也被字符串末尾的进行覆盖,所以原来的5被0覆盖!这就是a躺着也中枪的真实原因! 超长的字符串加上结尾的使得下一个变量的值也受到了影响!
这就是数组越界引发的问题的实验,希望对大家有帮助!
文丨黄老师
图丨黄老师
编辑丨蓝 魅
有问题欢迎指出
C学习
黄老师
网页
应用
1、本站发布的内容部分购买于网络,仅供读者学习与参考,如有侵权,请联系站长进行删除处理。
2、本站一切资源不代表本站立场,不代表本站赞同其观点和对其真实性负责。
3、本站仅分享资源,以极低的价格降低大家被割韭菜的损失。本站无法保证资源质量,所以介意的小伙伴请勿下单!
4、资源大多存储在云盘,如发现链接失效,请联系站长第一时间更新。