问题描述
- c问题---关于数组溢出
-
今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了?
解决方案
你的数组越界了,C不会对此做出检查。越界的部分可能是没有使用的内存空间,或者是别的变量用的空间,或者根本就不存在。这个就很难说了。
好比把汽车开到马路外面,可能是草地,可能是沼泽,可能是河
解决方案二:
下标是11的地方也可以赋值,只能说明你运气比较好,你可以断点开下a的内存地址内容,第11个位置如果是空的那么你就能放,如果不是空的那么程序就崩溃了
解决方案三:
说到底还是语法不够严谨,应该报错的
解决方案四:
你的数组越界了,长度为10,你为11赋值不对
解决方案五:
其实知道数组越界就够了。
就好比人总是要死的,你问死了之后会怎么样呢,谁知道呢。活着的时候,想都别想这个,比较好。
解决方案六:
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层的这一层是没有被授权的,然而他自己并不知道多参观这一层会有什么后果,尽管他参观了,并留下了他的脚印...
解决方案七:
题主,看到你的问题我写了篇博客,详细描述了指针访问越界后的现象,详见:http://blog.csdn.net/douqingl/article/details/50590574
希望能帮到你
解决方案八:
如果你定义的是a[10], 那么可访问的范围应该是a[0]到a[9], 访问a[10]以上都是错误的。如果9以后的地址是可访问的,你应该得到的是一个随时数,如果不可访问,程序就会崩溃。
解决方案九:
a[11]就在内存中,就在a[10]后面一个,你可以声明一个int a[10]然后把a[11]赋值 然后 scanf("%d",a[10+1]);试试,如果是你赋值的值 说明在物理存储上是在a[10]后面的。
解决方案十:
越界是肯定了,但并不是所有的越界立刻会表现出严重的错误。
假如你的数组有内存的空间中的前后都是指针,这时就会错误的修改了指针的值,此时再通过指针访问其所指向的地址,可能就会因为地址无效而引起程序崩溃。