4 个回答

数据下标从0开始

新手上路,请多包涵

会溢出
图片描述clipboard.png

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,循环停不下来了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进