1个经典的C语言例子

expter 2007-06-05 04:02:32
#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);

}

大家踊跃讨论...
...全文
1831 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
shellyyee 2007-06-06
  • 打赏
  • 举报
回复
关注
lkldiy 2007-06-06
  • 打赏
  • 举报
回复
学习了
  • 打赏
  • 举报
回复
数组溢出
就这么简单!
asert 2007-06-06
  • 打赏
  • 举报
回复
学习
hokkien 2007-06-06
  • 打赏
  • 举报
回复
当然是上面的原因了
IMGGTOO 2007-06-06
  • 打赏
  • 举报
回复
wenchanyee(叶文强) ( ) 信誉:100 Blog 加为好友 2007-6-5 23:21:30 得分: 0



死循环.


声明的变量i, 数组,
内存中分配的地址是连续的.
name[10]的地址 恰好是i的地址.

//////////////////////////////////////
佩服!!!
感觉分析的是这个道理,明天拿去测试下!
hokkien 2007-06-06
  • 打赏
  • 举报
回复
int i; //先压栈,ESP往低移
int name[10]//接着压栈,ESP又往低移
hokkien 2007-06-06
  • 打赏
  • 举报
回复
即 压栈时ESP往底地址移动
南京大白蔡 2007-06-06
  • 打赏
  • 举报
回复
除了数组越界是确定的,其他都不定!至于由于低地址生长而造成的i值被覆盖从而形成死循环,这是与编译器有关的,比如在vc6下就会出现这样的情况,但是在Dev c++和vs2005下都不会!
shengger 2007-06-06
  • 打赏
  • 举报
回复
name[10]越界
xpice 2007-06-06
  • 打赏
  • 举报
回复
出错!越界!!!鉴定完毕
acerl1916w 2007-06-06
  • 打赏
  • 举报
回复
为什么?
0,<certexit.h>你要告诉朋友是哪个库的接口,对初学者会晕
1,中国科学院软件研究所出过的一道考验题
2,跟编译环境有关,不是移植代码
朋友们可以分别在tc ,devc++,vc 等等环境下编译,看看你了解你的工具吗?
3,C Traps and Pitfalls,里面说的很清楚
4,了解你的cpu的堆栈,X86的堆栈是向下增长的,先分配i的地址,然后分配10个空间给name[]。依次
是(地址从高到低)i,name[9],name[8]...name[0]!
5,代码缩进的想解雇你
6,你自己不知道讨论什么,语法常识?代码优化?体系结构?编译原理?
7,抛弃这种类型的代码写法,只能作学习用,不能当个性
Woody_KAKA 2007-06-06
  • 打赏
  • 举报
回复
VC6出现死循环,VC2003则不会
IMGGTOO 2007-06-06
  • 打赏
  • 举报
回复
看来,这个与具体的编译器有关。

我刚才拿VS2005测试了下,调试发现,i和name的地址分别为:
i: 0x0012ff4c
name:0x0012ff1c

他们的内存分配并不是连续的,其中留了点“空隙”(8个字节),我估计这可能是VS2005专门留出来防止数组越界,但事实上,我又在i和name之间申请了另外一个非数组变量int j;i和j之间仍然也留有8个字节的空间。
所以,我把循环条件改成i<=12,才形成了死循环。

不过得感谢wenchanyee(叶文强) ( ),让我明白了这个原理!
acerl1916w 2007-06-06
  • 打赏
  • 举报
回复
低级
comman_ndsc 2007-06-06
  • 打赏
  • 举报
回复
请问 certexit.h 着个头文件是如何描述的,它有什么功能?
zhujiujun 2007-06-06
  • 打赏
  • 举报
回复
早就研究过了
数组越界
不同的编译器和平台输出的结果不同
如vc6,死循环
gcc, 多输出一位
。。。
comman_ndsc 2007-06-06
  • 打赏
  • 举报
回复
上面的代码有错:

纠正一下:
#include<stdio.h>
#include<certexit.h>
void main(void)

{

int i,j=0;

int name[10];

for(i=0;i<=10;i++)

name[j]=5;

printf("done!");

exit(1);

}
comman_ndsc 2007-06-06
  • 打赏
  • 举报
回复
以下是我在google里搜到的:不好意思和loveverfc的一样

其中 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;其他地方不动,程序也可以正常返回!

注明一下:这个程序结果与操作系统无关,有关的是处理器栈的增长方向!当然编译器也会对其有影响!
xddzccn 2007-06-06
  • 打赏
  • 举报
回复
数组越界了吧
加载更多回复(26)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧