+ -
当前位置:首页 → 问答吧 → 关于gcc和vs的一点小看法和疑问

关于gcc和vs的一点小看法和疑问

时间:2010-08-18

来源:互联网

  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

作者: wkq5325   发布时间: 2010-08-18

gcc编译之后,执行会意外的成功么? 还是说,只是在gdb调试中,能成功执行?

作者: EricFisher   发布时间: 2010-08-18

“gcc处理时,就把NULL赋值给temp->next了”,运气而已,跟运行时候的环境有关,跟gcc无关

作者: hellioncu   发布时间: 2010-08-18

回复 EricFisher
gcc执行成功
vs执行不成功

作者: wkq5325   发布时间: 2010-08-18

gcc使用的是c99的标准,vs使用的是c90的标准,
两个标准有很多的不一样的地方,当然,始终按照c90的标准来编写程序总是没错的,
不过按照c99来编写程序有时会很省事情,也不错哦
你的这个应该是标准不一致造成的

作者: roolcz   发布时间: 2010-08-18

回复 hellioncu


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

作者: wkq5325   发布时间: 2010-08-18

回复 roolcz

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

作者: wkq5325   发布时间: 2010-08-18

记得好像跟编译器有关

作者: tianxiaogang12   发布时间: 2010-08-18



QUOTE:
回复  hellioncu


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




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

作者: hellioncu   发布时间: 2010-08-18

回复 hellioncu

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

作者: wkq5325   发布时间: 2010-08-18

测试楼主代码,Mingw下错误代码死循环。

作者: zhaohongjian000   发布时间: 2010-08-18