前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组越界为什么没有出错

数组越界为什么没有出错

作者头像
编程范 源代码公司
发布2018-04-18 16:22:12
2K0
发布2018-04-18 16:22:12
举报

数组越界

在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

那什么是数组?

首先,我们应该知道数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。(下标通常从0开始算起:0、1、2、…n。)

组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。

在知道以上情况后,

如果我们定义了一个长度为5的数组:

int[] a = new int[5];

那么你用a[0]到a[4]都不会越界,当你的数组下标大于5时,就会数组越界。

However

问题来了

请看下面一个小程序

如果,在编译器上,

运行此代码。

编译器不报错&&运行成功

这个程序运行时是这个样子:

这就是一个典型的数组越界引发的问题,如果大家细心读程序观察结果,就会发现虽然str字符串的内容没有问题,但旁边的整形变量a似乎有点“抢镜”哦,原来是5,可现在竟然输出0! 再看看代码,又没有被赋值,就莫名由5改成了0!真是躺着也中枪啊!

那这里为什么a的值被更改了呢?下面我们为大家详细解释!

若要查明这个原因,大家可以跟踪内存,尤其变量a的位置便可以查明一二。

如图,Strcpy函数前下断点,首先确认a的值和str的初始值:

a确认是5没有问题,由于str数组的地址我们观察到比a要小,所以内存监视这里我们更新为str的地址。

可以顺便观察str和它后面的a两个值,

如下图:

可以看到str地址0x0019ff30处还未初始化,而a的地址为0x0019ff3c且初始化为5,没有问题!

执行下一步继续观察:

到这里,我们看到str数组已经被初始化为0(红色部分占10个字节),

注意此时的a距离str最后一个元素也就是str[9]的位置也就三个字节!

现在大家可以偷偷再数一数strcpy给str拷贝的字符串长度为12个…咳咳。

那么继续下一步,继续观察:

注意,问题来了!

Strcpy这一步直接导致从0x0019ff30处开始的13个字节全部更改,并且波及到了a的地址0x0019ff3c处,仔细观察分析内容可以看到前12个分别为123456789123这12个数的ASC码,而第13个字节的内容则为字符串结尾的’\0’所致!

这就使得第13个字节处的内容也就是a的地址也被字符串末尾的\0进行覆盖,所以原来的5被0覆盖!这就是a躺着也中枪的真实原因! 超长的字符串加上结尾的\0使得下一个变量的值也受到了影响!

这就是数组越界引发的问题的实验,希望对大家有帮助!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档