一段经典C代码分析
2007-10-26 23:43
309 查看
#include<stdio.h>
#include<certexit.h>
void main(void)
{
int i;
int name[10];
for(i=0;i<=10;i++)
name[i]=0;
printf("done!");
exit(1);
}
上面这一段代码会产生什么结果,为什么??要从本质阐述!不能只说因为循环次数不能是10,这很肤浅地?? 其中 i 和 name[]都是局部变量,就是说分配内存的时候分配在栈中,分配的顺序是地址由低到高 name[0]----name[9],i,在连续空间中.关键在于X86的堆栈是向下增长的,先分配i的地址,然后分配10个空间给name[],但是对数组来说永远是大头朝上.实际上name[10]就是 i了!在这里就永远没有机会大于10了!
如果改成如下的形式
#include<stdio.h>
#include<certexit.h>
void main(void)
{
int i,,j=0;
int name[10];
for(i=0;i<=10;i++)
name[i]=5;
printf("done!");
exit(1);
}
这样程序就可以返回,可以单步调试一下看看 j等于多少.或者把 name[i]=11;其他地方不动,程序也可以正常返回! 注明一下:这个程序结果与操作系统无关,有关的是处理器栈的增长方向!当然编译器也会对其有影响!
原贴地址:http://bbs.xdnice.com/b59t239982.htm
#include<certexit.h>
void main(void)
{
int i;
int name[10];
for(i=0;i<=10;i++)
name[i]=0;
printf("done!");
exit(1);
}
上面这一段代码会产生什么结果,为什么??要从本质阐述!不能只说因为循环次数不能是10,这很肤浅地?? 其中 i 和 name[]都是局部变量,就是说分配内存的时候分配在栈中,分配的顺序是地址由低到高 name[0]----name[9],i,在连续空间中.关键在于X86的堆栈是向下增长的,先分配i的地址,然后分配10个空间给name[],但是对数组来说永远是大头朝上.实际上name[10]就是 i了!在这里就永远没有机会大于10了!
如果改成如下的形式
#include<stdio.h>
#include<certexit.h>
void main(void)
{
int i,,j=0;
int name[10];
for(i=0;i<=10;i++)
name[i]=5;
printf("done!");
exit(1);
}
这样程序就可以返回,可以单步调试一下看看 j等于多少.或者把 name[i]=11;其他地方不动,程序也可以正常返回! 注明一下:这个程序结果与操作系统无关,有关的是处理器栈的增长方向!当然编译器也会对其有影响!
原贴地址:http://bbs.xdnice.com/b59t239982.htm
相关文章推荐
- MFC中一段经典的http协议post图片代码出现中文的错误分析 (转)
- 从一段经典错误代码说起——关于局部变量指针和函数传参的问题分析
- 一段经典的javascript代码分析
- 一段经典的javascript代码分析
- 一段大家熟悉的汇编代码分析
- 【转载】一段有趣的Javascript代码及分析
- 一段dos代码的分析
- 一段比较经典的多线程学习代码
- 'or'='or'经典漏洞代码分析
- 互联网业界经典 经典业务 经典需求 经典分析 经典方案 经典代码 经典呈现 经典片段 PHP经典案例
- 分析网友的一段求救小程序,20行代码有多少错误?多少可改进之处?
- 谁能帮我分析一段代码?
- eclipse 经典快捷键之将某一段代码整体放入try()语句块中的快捷键
- 一段经典的c 分析
- 一段经典的c代码
- 一段简单C++代码问题分析
- 一段流量分析工具代码
- 回顾JavaSE(5)-String(4)7行代码分析一道关于String拼接的经典面试题
- 最经典的搬运代码分析