#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]); }