社区
C语言
帖子详情
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
打赏
收藏
1个经典的C语言例子
#include #include void main(void) { int i; int name[10]; for(i=0;i<=10;i++) name[i]=0; printf("done!"); exit(1); } 大家踊跃讨论...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
46 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
shellyyee
2007-06-06
打赏
举报
回复
关注
lkldiy
2007-06-06
打赏
举报
回复
学习了
会编程的大白熊
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)
C语言
的
经典
例子
经典
经典
应该蛮实用的
C语言
的
经典
例子
经典
经典
C语言
的
经典
例子
经典
经典
178个
经典
C语言
源码
178个
经典
C语言
源码
《
C语言
/C++学习指南》Qt界面开发篇视频精讲
本篇讲解如何使用Qt库进行界面开发,是一个从入门到精通的教程。主要的演示平台为VS2008 + Qt4.7.3,从简单的
例子
入手,覆盖Qt界面开发的近乎全部技术点。(自定义Widget、对话框、事件处理Singal & Slot、界面...
c语言
经典
900例
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
C语言
经典
例子
900
c语言
经典
例子
100个
此100
C语言
经典
例子
十基本教学中会经常用到的
C语言
经典
例子
,有助与
C语言
初学者参考!
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章