CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

C代码中的异常问题

楼主kiko_lee(清醒的迷茫中)2005-06-01 17:42:50 在 C/C++ / C语言 提问

在一个比较大的C代码项目中,出现过这样的问题。  
   
  平时运行都是正常的。  
   
  在某个函数中间增加一个   打印语句   printf(),打印一些字符串,然后再执行时就会出现异常。  
   
  删除打印语句,或者在其他的地方增加一些毫无意义的东西,比如增加一个空函数,或者增加一些打印。  
   
  异常消失。  
   
  各位,在实际工作中有没有遇到过这样的情况,可能是什么导致造成的呢。实在太异常了。  
   
  我的分比较多,能比较好的解决,无所谓的。 问题点数:100、回复次数:12Top

1 楼shockwave_115(采姑娘的小蘑菇)回复于 2005-06-01 17:45:34 得分 5

估计是指针越界或者没有初始化,printf访问的内存有问题Top

2 楼mccxj(老鼠不逛街)回复于 2005-06-01 17:46:46 得分 10

在一个比较大的C代码项目中,出现过这样的问题。  
   
  平时运行都是正常的。  
   
  在某个函数中间增加一个   打印语句   printf(),打印一些字符串,然后再执行时就会出现异常。  
   
  删除打印语句,或者在其他的地方增加一些毫无意义的东西,比如增加一个空函数,或者增加一些打印。  
   
  异常消失。  
   
  各位,在实际工作中有没有遇到过这样的情况,可能是什么导致造成的呢。实在太异常了。  
   
  我的分比较多,能比较好的解决,无所谓的。  
  ~~~~~~~~~~~估计是编译器的问题。。以前我也遇到很奇怪的问题。。增加一个<<endl;就没事情。。。如果去了。后边的东西就执行不了了。。。到现在我也不明白是怎么回事。。。Top

3 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-01 17:48:57 得分 0

呵呵,markTop

4 楼foochow(无聊,灌水......)回复于 2005-06-01 17:53:53 得分 0

没遇到过,关注mark!!Top

5 楼Michael_555(Nothing)回复于 2005-06-01 18:05:35 得分 5

栈溢出了。  
   
  查查你的数组是否越界或者指针没有分配内存便使用。  
  Top

6 楼whyglinux(山青水秀)回复于 2005-06-01 18:09:32 得分 10

这说明在程序中存在着未定义的行为。通常由于指针的非法内存访问而导致的程序的未定义行为最为常见。  
   
  首先要了解程序异常时的出错信息。其次要找出程序异常发生的地点,这样对程序进行调试跟踪就是必须的了。找到异常发生的地方之后,就可以对附近的源代码进行重点检查了。Top

7 楼kikikind(可乐)回复于 2005-06-01 18:36:43 得分 0

在汇编里试过~~~~~一开始运行我写的程序没输出,要先运行一个可以执行的程序,再运行我写的程序才出现结果!!-_-!Top

8 楼ngucc(嘎嘎)回复于 2005-06-01 18:56:36 得分 5

听我老师说过,PRINTF有好多问题,本身的漏洞,我不懂Top

9 楼herryhuang(Herry)回复于 2005-06-01 21:26:07 得分 50

首先,我们应该相信编译器,这个应该不是编译器的问题。  
   
  然后,需要确认不是因为多线程或多进程的程序发生数据访问冲突,因为printf的执行周期较长,其间可能会有任务切换。  
   
  将你的printf(就是会导致异常的地方)尽量简化,最好其中的参数不要包含有宏、其他函数调用。  
   
  在调用printf之前,首先调用fflush,并检查标准输入、标准输出和标准出错文件的状态(看文件是否正常打开,并且文件结构各个参数无错)  
   
  printf本身确实应该谨慎使用,但是如果按照你说的,随便打点什么(比方说只打一个回车符,或者什么也不打,只调用一下printf(""))就出错的话,应该是程序中有指针跑飞了,如果想验证这一点,建议长时间、大负荷量的进行耐压测试,我相信程序会跑死的。  
   
  有一些调试工具可以用来检查内存泄露(但是没发现检查数组越界的工具,如果谁见过,劳驾告诉我,这个属于C语言的“根本”问题决定的),你可以试试,如果确定是内存泄露的问题,而且很不好查,那就需要将程序分解,进行单元测试,一个模块一个模块的排除问题。  
   
  通常充分的单元测试可以找到指针跑飞的问题,我碰到过的最难查的内存泄露问题是采用重写malloc和free来完成的(那个模块代码23万行),将程序中所有的malloc和free都替换成自己定义的宏,在宏中以特定格式写日志文件,其中记录分配内存的地址、大小以及释放内存的地址,还有调用处的文件名,行号和函数名,不断运行程序直到崩溃。然后另写一个程序处理这个日志文件,将其中的记录利用数据库处理,终于查出问题之所在。  
   
  因为检查内存泄露是最费尽的,所以,建议建议进行充分的单元测试和集成测试。  
   
  上面是一点点经验,你先试试看。Top

10 楼MagicCarmack(MagiC++)回复于 2005-06-01 21:32:07 得分 5

学习楼上的。。。。。。。。。。Top

11 楼mostideal(三甲)回复于 2005-06-02 00:21:24 得分 5

帮顶。。Top

12 楼nasi00(莫傲·逍遥)回复于 2005-06-02 01:56:56 得分 5

应该是是程序中有些动作的结果是“不被预知”的,这样就会出现一些莫名其妙的问题了……Top

相关问题

  • 在c++中如何调用c代码?
  • 能在c#中使用c++代码吗?
  • c++中的除法异常
  • BCB_FANS兄,关于C++捕获runtime异常的代码在这里。
  • 求教! C#托管代码调用非托管时出现的 NullReferenceException 异常.
  • C#源代码
  • c++原代码
  • C原代码?
  • C++代码?
  • 求c++代码!

关键词

  • 函数
  • 代码
  • 语句
  • 打印
  • 异常
  • c代码
  • 增加
  • 问题
  • 遇到
  • 出现

得分解答快速导航

  • 帖主:kiko_lee
  • shockwave_115
  • mccxj
  • Michael_555
  • whyglinux
  • ngucc
  • herryhuang
  • MagicCarmack
  • mostideal
  • nasi00

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo