C语言中数组越界导致死循环的测试
2013-08-29 11:48
260 查看
#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]); }
相关文章推荐
- C语言中数组越界访问造成死循环现象
- 数组越界导致死循环
- 数组越界导致容器push_back或erase报错
- C语言中不检查数组越界的应用
- C# json反序列化 对象中嵌套数组 (转载) 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
- ios7真机测试 数组越界问题总结1
- 合并数组时标记元素越界导致错误
- 为什么c语言中字符数组可以越界
- C语言中二重指针和指针数组以及数组指针的测试
- 第二次测试循环+一点数组
- 关于一个数组越界之后的死循环
- c语言int型数组长度求法及测试
- 数组越界导致的运行崩溃(枚举作为数组中的常量)
- 68 C语言数组的静态性、越界以及溢出
- C语言中的数组越界
- 解决C语言从键盘输入不合法数据所导致的死循环
- C语言实现约瑟夫环,使用循环单链表和循环数组2种方法
- 一道有趣的数组越界、循环问题
- 【学习ios之路:C语言】数组.循环.语句总和运用试题练习
- 结构体对齐导致结构体数组大小变化引发的指针越界操作问题.