这一小段C程序会如何运行

Image

回答:

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

以上是 这一小段C程序会如何运行 的全部内容, 来源链接: utcz.com/p/193965.html

回到顶部