2 gandalfool Gandalfool 于 2016.09.08 18:23 提问

数组越界访问时会发生什么 尽管编译不出错

int a[ 10 ] ; 访问a[ 10 ]的话就会出现越界的错误 今天想了一下 下标访问数组可以看作指针访问的形式 也就是取( & a[ 0 ] + 10 * sizeof ( int ) ) 这个地址里的内容 然后我就想 反正数组是连续存储的 用了后面那四个字节的内存又怎么样呢 应该不会是无意义的内存吧 那为什么会出现Bug或者程序中断呢 求解

8个回答

hi_chen_xingwang
hi_chen_xingwang   Rxr 2016.09.08 18:37
已采纳

数组占用了一段连续的内存空间。然后,我们可以通过指定数组下标来访问这块内存里的不同位置。因此,当你的下标过大时,访问到的内存,就不再是这个数组“份内”的内存。你访问的,将是其它变量的内存了,它的值是不确定的,不可控的,它会使按照数组读取方法调用的这块内存的其他类不能正确解析到需要的值本来你就想要个10 来了个2^32-1 你让别人怎么玩?

mengshunxaing
mengshunxaing   2016.09.08 18:40

我也只知道,越界的数据地址,保存了程序运行的其他变量,如果更改越界数据了,就改变了程序运行的其他变量,如果更改的正好是栈指针什么的,那么程序就会崩溃类的错误,程序中断,也许是系统为防止更严重错误而做出的保护机制吧,我只知道这么多了,望大神来解答。

qq_29594393
qq_29594393   Ds   Rxr 2016.09.08 19:13

访问到不该访问的对象,系统启动保护机制,直接中断程序的运行,由于越界后还继续运行的话,有可能产生严重的错误

limutian
limutian   2016.09.08 19:52

图片说明
图片说明

越界与否在c和c++里面要自己来细心处理的。

limutian
limutian   2016.09.08 19:55

不好意思。发错图了
图片说明
图片说明

artyoung0421
artyoung0421   2016.09.08 23:26

段错误(核心信息已存储)

hijack00
hijack00   Rxr 2016.09.09 09:00

段错误(Segment Fault),程序崩溃

Gandalfool
Gandalfool   2016.09.10 19:02

懂了。。。果然要细细钻研 谢谢各位大牛们

Csdn user default icon
上传中...
上传图片
插入图片