vc++6.0编译器按照内存地址递减的方式来给变量分配内存

来源:互联网 发布:简易电路设计软件 编辑:程序博客网 时间:2024/06/13 11:33

在看c陷阱与缺陷时,有这么一段代码:

int i;int a[5];for(i = 0; i <= 5; i++){a[i] = 0;}
(对源代码做了小小的改动,不影响操作)

不明白为什么会陷入死循环。

为了做对比,我又写了一段代码。因为我想的是不是超出数组边界引发的死循环?

int i;int a[5];for(i = 0; i <= 5; i++){a[i] = i;}
结果程序没有陷入死循环,当时还想打印出a[5]的值,看看是不是等于5.现在明白了,打印出来的值其实是*(a+5)。

关于陷入死循环c陷阱与缺陷(p46)中讲到编译器按照内存地址递减的方式来给变量分配内存,那么内存中数组a之后的一个字实际上是分配给了整形变量i.此时,i的值为10,循环体内将并不存在的a[10]设置为0,实际上却是将计数器i 的值设置为0,这就陷入了死循环。

另附一张图,看过会更清晰:



原创粉丝点击