#include <stdio.h>
//如何把这段代码变成死循环,就像《C语言缺陷和陷阱》里描述的那样
//经过测试发现,变量i的地址和a[CRAZYNUM]的地址一样,当执行
//a[CRAZYNUM] = 0;相当于i=0;所以死循环跑起来啦。
//测试环境:win7(32) Dev-C++ 4.9.9.2
//《C语言缺陷和陷阱》中的场景是编译器按照内存地址递减的方式
//来给变量分配内存,那种编译器CRAZYNUM=10就会死循环
#define CRAZYNUM 15
int main()
{
int i, a[10];
for(i = 1; i <= CRAZYNUM; i++)
{
a[i] = 0;
printf("i=%d\n", i);
}
//打印i的地址,a[10]的地址
printf("&i = %x\n", &i);
printf("&a[%d] = %x\n", CRAZYNUM, &a[CRAZYNUM]);
return 0;
}
void test_cycle()
{
//如何把这段代码变成死循环,就像《C语言缺陷和陷阱》里描述的那样
//经过测试发现,变量i的地址和a[CRAZYNUM]的地址一样,当执行
//a[CRAZYNUM] = 0;相当于i=0;所以死循环跑起来啦。
//测试环境:win7(64) VS 2010
//《C语言缺陷和陷阱》中的场景是编译器按照内存地址递减的方式
//下面这段代码确实位会死循环,我测试的情况是因为i的地址在a[0]和a[14]之间了,不知道为什么会这样子
#define CRAZYNUM 15
int i, a[10];
printf("sizeof(int) = %d\n", sizeof(int));
printf("&i = %x\n", &i);
printf("&a[%d] = %x\n", 0, &a[0]);
printf("&a[%d] = %x\n", CRAZYNUM-1, &a[CRAZYNUM-1]);
for(i = 1; i < CRAZYNUM; i++)
{
a[i] = 0;
printf("i=%d\n", i);
}
//打印i的地址,a[10]的地址
printf("&i = %x\n", &i);
printf("&a[%d] = %x\n", CRAZYNUM, &a[CRAZYNUM]);
}