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   Rxr 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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c问题---关于数组溢出的思考
逛CSDN看到这么一个问题: c问题---关于数组溢出的思考 今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了? 原问题见:http://ask.csdn.net/questions/234444  提问:hehajoker  其实原问题下的回答已经能解决题主的问题了,只是
数组溢出问题解决
报错:“0x10214556”指令引用的“0x3dc08cc7”内存。该内存不能为read。   出错原因找到了,前面定义数组元素最多为8000,但是导入的3DS模型点的个数有10000多,所以数组溢出。 解决办法:在函数中读出点和面的个数,然后动态分配数组即可,省空间哦。另外指向数组的指针与数组名是等价的,如int *p=new int[n],可以用p[i]调用元素。C++基础薄弱啊。
谈谈C语言的溢出
溢出是C语言中最常见的漏洞。最常见的溢出包括数组溢出、数溢出、缓冲区溢出、指针溢出以及栈溢出,下面笔者就对这些溢出做一个总结归纳。 1 数组溢出 数组溢出是最常见的一种溢出。因为在C语言中,含N个元素的数组下标是从0开始,到N-1结束,而且C语言没有提供数组越界检查的机制。 请看如下代码: int main (int argc, char* argv[]) {     int nSum = 0;     int nArray[] = {
结构体内的数组用指针表示的时候要注意指针溢出造成不必要的bug
结构体内的数组用指针表示的时候要注意指针溢出造成不必要的bug
平均值考虑溢出的问题
[cpp] view plaincopy int avg(int x, int y)   {            return (x & y) + ((x ^ y) >> 1);   }   解释:X+Y= (X^Y)+((X&Y) SO: (X+Y)/2==((X^Y)>>1)+(X&Y)
68 C语言数组的静态性、越界以及溢出
C语言数组的静态性、越界以及溢出
解决大数组定义时栈溢出的两种方法
1. 数据结构上: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是1M(也有的说是2M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。   堆:堆是向高地址扩展的数据结构,是不连续的内存区域
数组的下标越界与内存溢出
很相似的两个概念,一不小心就会混淆首先,对两个名词做一个大概的解释: 下标越界 在引用数组元素时,使用的下标超过了该数组下标的应有范围,但应注意的是: C/C++不对数组做边界检查。 可以重写数组的每一端,并写入一些其他变量的数组或者甚至是写入程序的代码。不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这
数组过大导致堆栈溢出问题
问题描述:     #define定义一个常量MAX,当MAX=100000时可以成功定义整型数组a[MAX] ,但是当MAX定义大小为1000000时(多了一个零),定义的这个数组a便无法成功运行。原因:    定义的数组a过大,超出了默认的栈空间大小。解决方法:1. 在IDE上设置默认堆栈大小,改大一点;2. 使用malloc动态申请数组空间,最后需要free释放内存空间;3. 使用new申请...
关于C语言开大数组溢出的问题
C语言的内存分配、堆栈溢出、全局变量、局部变量、全局数组大小、局部数组大小