数据下标从0开始
会溢出图片描述
VC报错很好理解,a[10]下标越界了。由于VC编译器的栈内存是向下增长的。但是注意a[0]到a[9]数组地址永远是从低到高的。所以栈空间应该是i a[0]...a[9] 。所以a[10]越界是应该不影响i的。而且Debug方式下未分配的栈空间会设置为0xCC。这样溢出的改写就会被检查到,所以弹出的那个框。就算颠倒变量声明顺序也不行,以为变量之间也插入了0xCC防止溢出。
C语言并没有规定局部变量必须连续的,甚至没有规定用向下增长的栈。
我用GCC G++ 4.9.2(MinGW)试了,竟然是无限循环,取了一下地址,i竟然在a[9]上面。而且不受声明的顺序影响。说明G++重新安排了变量顺序。然而GCC的行为和预期一致,写成int a[10], i不会崩溃(同前面分析)。但是写成int i, a[10]则发生死循环(因为GCC不会在变量之间插东西)。
无限循环呗。
a[10]下标越界了,但是正好内存中下一个数据就是后面的变量i,循环变量i被重新赋值成0,循环停不下来了。
a[10]
i
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(4)
数据下标从0开始
会溢出
图片描述
VC报错很好理解,a[10]下标越界了。由于VC编译器的栈内存是向下增长的。但是注意a[0]到a[9]数组地址永远是从低到高的。
所以栈空间应该是i a[0]...a[9] 。所以a[10]越界是应该不影响i的。而且Debug方式下未分配的栈空间会设置为0xCC。这样溢出的改写就会被检查到,所以弹出的那个框。就算颠倒变量声明顺序也不行,以为变量之间也插入了0xCC防止溢出。
C语言并没有规定局部变量必须连续的,甚至没有规定用向下增长的栈。
我用GCC G++ 4.9.2(MinGW)试了,竟然是无限循环,取了一下地址,i竟然在a[9]上面。而且不受声明的顺序影响。说明G++重新安排了变量顺序。
然而GCC的行为和预期一致,写成int a[10], i不会崩溃(同前面分析)。但是写成int i, a[10]则发生死循环(因为GCC不会在变量之间插东西)。
无限循环呗。
a[10]
下标越界了,但是正好内存中下一个数据就是后面的变量i
,循环变量i
被重新赋值成0,循环停不下来了。