现在的位置: 首页 > 综合 > 正文

C语言中数组越界导致死循环的测试

2013年03月28日 ⁄ 综合 ⁄ 共 917字 ⁄ 字号 评论关闭
#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]);
}

抱歉!评论已关闭.