2 hehajoker hehajoker 于 2016.01.25 20:38 提问

c问题---关于数组溢出
c

今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了?

10个回答

caozhy
caozhy   Ds   Rxr 2016.01.25 20:51
已采纳

你的数组越界了,C不会对此做出检查。越界的部分可能是没有使用的内存空间,或者是别的变量用的空间,或者根本就不存在。这个就很难说了。
好比把汽车开到马路外面,可能是草地,可能是沼泽,可能是河

qq_27183003
qq_27183003 赞同。楼主试试a[88]=3可能也不会出错,看你运气了。
接近 2 年之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.01.25 21:28

下标是11的地方也可以赋值,只能说明你运气比较好,你可以断点开下a的内存地址内容,第11个位置如果是空的那么你就能放,如果不是空的那么程序就崩溃了

enpterexpress
enpterexpress   2016.01.25 21:41

说到底还是语法不够严谨,应该报错的

Mr_dsw
Mr_dsw   Ds   Rxr 2016.01.25 20:56

你的数组越界了,长度为10,你为11赋值不对

jiangwei0512
jiangwei0512   2016.01.25 21:44

其实知道数组越界就够了。
就好比人总是要死的,你问死了之后会怎么样呢,谁知道呢。活着的时候,想都别想这个,比较好。

polga
polga   2016.01.25 23:01

a[11]表示紧跟在前10个整型内存空间的一个整型大小的内存空间中的值。
定义整型数组a[10],意味着系统分配了10倍整型大小的空间,如果存储一个整型用4个字节的内存空间来存储,那么系统分配了连续的40个字节的内存空间,a[0]就对应这40个字节的头4个字节的内容,即第一个整型值,a[1]就对应这40个字节的第二组4个字节的内容,以此类推,因为数组被定义为整型,所以下标每变化一个单位对应着4个字节的存储空间,那么,a[11]就对应着紧随这40个字节之后的4个字节的内容,而数组下标的递增对应的是地址的连续的变化(在这里,当然是每隔4个字节)。
打个比方,比如,一个人爬楼梯,他计划爬10层,当他爬到第十层时,他又多爬了一层,显然这多出来的一层是存在的;如果问题是这样的,这个人爬楼梯实际上是参观,他申请了10层,而管理者接受了他的申请并允许他参观连续的10层,并告诉他从第一层在哪里,当他参观完10层后,意外地发现11层也可以参观,显然,参观紧挨着前10层的这一层是没有被授权的,然而他自己并不知道多参观这一层会有什么后果,尽管他参观了,并留下了他的脚印...

douqingl
douqingl   2016.01.27 00:38

题主,看到你的问题我写了篇博客,详细描述了指针访问越界后的现象,详见:http://blog.csdn.net/douqingl/article/details/50590574
希望能帮到你

jfeagle
jfeagle   2016.01.27 15:36

如果你定义的是a[10], 那么可访问的范围应该是a[0]到a[9], 访问a[10]以上都是错误的。如果9以后的地址是可访问的,你应该得到的是一个随时数,如果不可访问,程序就会崩溃。

DHPSL
DHPSL   2016.01.28 11:30

a[11]就在内存中,就在a[10]后面一个,你可以声明一个int a[10]然后把a[11]赋值 然后 scanf("%d",a[10+1]);试试,如果是你赋值的值 说明在物理存储上是在a[10]后面的。

91program
91program   Ds   Rxr 2016.01.25 20:59

越界是肯定了,但并不是所有的越界立刻会表现出严重的错误。
假如你的数组有内存的空间中的前后都是指针,这时就会错误的修改了指针的值,此时再通过指针访问其所指向的地址,可能就会因为地址无效而引起程序崩溃。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!