免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7090 | 回复: 17
打印 上一主题 下一主题

[C] 关于gcc和vs的一点小看法和疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-18 11:38 |只看该作者 |倒序浏览
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. #define INIT_SIZE  4

  4. typedef struct stufile
  5. {
  6.     .......
  7.        
  8. }record;
  9. record * Init_List()
  10. {
  11.         int i;
  12.              record   *L, *Ltemp;
  13.         L = (record *)malloc(sizeof(record));
  14.         L->next = NULL;
  15.        
  16.              record  *Lsec = L;
  17.        

  18.         for( i = 0; i < INIT_SIZE; i++)
  19.         {
  20.                 Ltemp = (record *)malloc(sizeof(record));
  21.                 Ltemp->numb = i;
  22.                 Ltemp->score = (float)(90 - i);
  23.         //        Ltemp->next = NULL;     //问题原因  
  24.                 Lsec->next = Ltemp;
  25.                 Lsec = Ltemp;
  26.         }
  27.        
  28.         return L;
  29. }

  30. int List_Length(record *L)
  31. {
  32.         int total_len = 0;
  33.         record * temp = L;

  34.         while(temp->next != NULL)  //vs下这里出错,
  35.         {
  36.                 ++total_len;
  37.                 temp = temp->next;
  38.         }

  39.         return total_len;
  40. }

  41. int main()
  42. {
  43.         int i = 0;

  44.         record *L1 = NULL;
  45.         L1 = Init_List();
  46.        
  47.         i = List_Length(L1);
  48.         printf("create list length is:%d\n", i);

  49. }
复制代码
上面的很简单的一个程序,求链表的长度
出问题的地方在Init_List函数里面,没有设置NULL空指针,
因此,List_Length函数的List_Length会出现访问冲突(访存不合法),
但是在gcc里面这个没问题,按理说有些不严谨

但是想想看:
gcc处理时,就把NULL赋值给temp->next了,所以程序可以完好的结束。
vs中处理的是把temp->next弄成某个地址(随便的吧),不是NULL,所以
会出问题。

当然程序员自身要更谨慎(都是自己的错,呵呵),这里只是说一下调试碰到的问题。

ps: 调试环境  gcc:4.4.3  gdb:7.1-ubuntu
        vs:2005

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2010-08-18 11:44 |只看该作者
gcc编译之后,执行会意外的成功么? 还是说,只是在gdb调试中,能成功执行?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2010-08-18 11:51 |只看该作者
“gcc处理时,就把NULL赋值给temp->next了”,运气而已,跟运行时候的环境有关,跟gcc无关

论坛徽章:
0
4 [报告]
发表于 2010-08-18 11:53 |只看该作者
回复 2# EricFisher
gcc执行成功
vs执行不成功

论坛徽章:
0
5 [报告]
发表于 2010-08-18 11:53 |只看该作者
gcc使用的是c99的标准,vs使用的是c90的标准,
两个标准有很多的不一样的地方,当然,始终按照c90的标准来编写程序总是没错的,
不过按照c99来编写程序有时会很省事情,也不错哦
你的这个应该是标准不一致造成的

论坛徽章:
0
6 [报告]
发表于 2010-08-18 11:56 |只看该作者
回复 3# hellioncu


   你说的不对吧,我是调试时,看到的,NULL赋值给。但vs并没有这么做
   程序运行是没问题的,那你的意思是,我再用gcc编译一遍再运行就可能有问题了,
   那我运气也太好了吧,每次都成功。

论坛徽章:
0
7 [报告]
发表于 2010-08-18 11:57 |只看该作者
回复 5# roolcz

也许吧,我只是当时感到很奇怪,竟然默认NULL结束了

论坛徽章:
0
8 [报告]
发表于 2010-08-18 11:59 |只看该作者
记得好像跟编译器有关

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2010-08-18 12:03 |只看该作者
回复  hellioncu


   你说的不对吧,我是调试时,看到的,NULL赋值给。但vs并没有这么做
   程序运行 ...
wkq5325 发表于 2010-08-18 11:56



    malloc申请到的内存是没有保证被初始化为0的,当然也有一定机会是0.
你每次都可以,很大程度是因为你机器的环境没有改变,试试运行前运行一些其他的程序,重启机器等

论坛徽章:
0
10 [报告]
发表于 2010-08-18 12:14 |只看该作者
回复 9# hellioncu

重启后,之前运行其他程序都可以成功运行(我也试着拷贝到另外一台服务器上,也行),应该和你说的不是一回事,
前面的一位说的给编译器有关,我觉得还差不多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP