关于C语言数组越界的演示程序
2013-04-17 21:25
211 查看
引子:
今天上课老师出了一道C语言数组越界的题目,虽然不难,但牵扯到内存分配和数组越界的相关知识,感觉自己真是孤陋寡闻啊,还以为都没办法运行呢。。回来试了一下,还正好遇到了点问题,下面总结一下~ PS:用codeblocks木有找到看内存的地方额。。。只能printf出来了。。。代码:
#include <stdio.h> main() { int v1; int a[3]; int v2; int i; v1 = 10; v2 = 20; printf("v1 addr = %x, array addr = %x, v2 addr = %x, i addr = %x\n", &v1, a, &v2, &i); printf("v1 = %d, v2 = %d\n", v1, v2); for(i=-1; i<=3; i++) { a[i] = i*2; } printf("v1 = %d, v2 = %d\n", v1, v2); return 0; }
根据变量根据声明顺序存放在栈中,根据CPU的不同可能有所区别,我的CPU是intel i5的处理器,栈底是高地址,所以存放示意图如下:
结果如图所示:
问题:
如果修改声明顺序,内存分布自然也会不同,因为压入栈的先后发生了变化,可能造成意想不到的后果,比如修改为:int v1; int v2; int a[3]; int i;
则内存分布示意图为:
程序运行结果如图所示,将运行不下去,进入死循环:
原因是在进入for循环时,语句 a[i] = i*2; 恰好修改了i(a[-1])的值,循环结束i++,即-2加一编程-1,i = -1继续死循环,我随手写的例子,还挺巧的呵呵~
相关文章推荐
- 关于C语言的函数调用过程和数组越界
- [笔记]关于split的数组越界问题以及java.lang.ArrayIndexOutOfBoundsException异常
- 关于C语言中的数组
- 关于包含0长数组的结构体对齐问题(C语言 Linux_x64 GNU编译器)
- 关于c语言中的字符数组和字符串指针
- 读取纯真IP数据库QQwry.dat的java版程序报数组越界异常问题
- C语言数组必须要懂得三个程序
- 由 Oil Deposits 反思 程序中数组越界的重大隐患
- 关于C语言的数组部分归纳
- c语言 一道关于数组的拓展训练
- error C2057: expected constant expression (C语言中数组的大小可以在程序运行时定义吗? )
- C语言中关于数组的运算
- 一个关于二叉树的创建、先序遍历、中序遍历、后序遍历、求叶子节点的完整函数的c语言完整程序。
- 关于C语言开大数组溢出的问题
- 为什么c语言中字符数组可以越界
- 关于c语言编写 顺序表 的创建、插入、修改、删除、显示、退出 的程序案例
- 关于C语言中数组的使用
- 关于c语言中的字符数组的输入问题
- 关于MATLAB入门的简单记录5 程序结构设计与C语言的区别
- C语言中的数组越界