免费注册 查看新帖 |

Chinaunix

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

[C++] GDB运行通过,G++运行发生段错误? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-07 14:46 |只看该作者 |倒序浏览
在写一个算法,其中一部分是生成一个动态增长的链表,其参数用dis控制,就是不同数值之间的距离,其增长方式有序。然而编译这部分函数提示有段错误,用GDB调试发现完美运行。。。
  1. #include "iostream"
  2. #include "cmath"
  3. #include "cstdlib"
  4. #include "cstdio"

  5. using namespace std;

  6. int a[9]={120,121,122,123,124,125,126,127,128};//测试用数组

  7. typedef struct absval
  8. {
  9.         int dis;//dis是不同数值之间的间距
  10.         int val;
  11.         struct absval* next;
  12. }absval;

  13. absval* adjust(absval* head,absval* newval);
  14. void destroy(absval* head);
  15. void getknnval(int *p,int a);

  16. absval* adjust(absval* head,absval* newval)//根据dis大小有序地增长这个链表
  17. {
  18.         if(newval->dis<=head->dis)//如果dis较小则放在这个节点前面
  19.         {
  20.                 newval->next=head;
  21.                 return newval;
  22.         }
  23.         else if(head->next==NULL)//到了末尾则放在末尾
  24.         {
  25.                 head->next=newval;
  26.                 return head;
  27.         }
  28.         else if(head->next!=NULL)//如果dis较大,则递归往后面放
  29.         {
  30.                 head->next=adjust(head->next,newval);
  31.                 return head;
  32.         }
  33. }

  34. void destroy(absval* head)//销毁这个链表,因为要多次生成调用,因此需要销毁节省空间
  35. {
  36. /*        absval* pix=head;//print the whole list//打印整个链表,观测其销毁过程
  37.         while(pix)
  38.         {
  39.                 cout<<pix->val<<" "<<pix->next<<" ";
  40.                 pix=pix->next;
  41.         }
  42.         cout<<endl;*/
  43.         if(head->next!=NULL)
  44.         {
  45.                 absval* temp=head;
  46.                 head=head->next;
  47.                 free(temp);
  48.                 destroy(head);
  49.         }
  50.         else
  51.                 free(head);
  52. }

  53. void getknnval(int *p,int a)//获取数值,生成链表
  54. {
  55.         absval* head=new absval;
  56.         absval* pix;
  57.         head->val=*p;//初始化链表头部
  58.         head->dis=abs(*p-a);
  59.         head->next=NULL;
  60.         int i;
  61.         int avval=0;
  62.         for(i=1;i<9;i++)
  63.         {
  64.                 pix=(absval*)malloc(sizeof(absval));//根据数组依次初始化节点
  65.                 pix->val=*(p+i);
  66.                 pix->dis=abs(*(p+i)-a);
  67.                 pix->next=NULL;
  68.                 head=adjust(head,pix);//调用函数调整这个链表,保持头部指针
  69.                 pix=head;//打印这个链表,观测链表的增长过程
  70.                 while(pix->next!=NULL)
  71.                 {
  72.                         cout<<pix->val<<" ";
  73.                         pix=pix->next;
  74.                 }
  75.                 cout<<pix->val<<endl;//打印链表尾部
  76.         }
  77.         pix=head;//回到头部,获取链表前5个元素的val
  78.         for(i=0;i<5;i++)
  79.         {
  80.                 avval+=pix->val;
  81.                 pix=pix->next;
  82.         }
  83.         cout<<avval<<endl;
  84.         destroy(head);//销毁这个链表
  85. //        return avval;//返回值,测试中没有使用这个东西
  86. }

  87. int main()
  88. {
  89.         getknnval(a,124);
  90.         return 0;
  91. }
复制代码
神奇的一点是,gdb下,所有的生成都是正确的,调整也是正确的,GDB下直接R的结果如下:
  1. Starting program: /home/lhl/imp/test
  2. 121 120
  3. 122 121 120
  4. 123 122 121 120
  5. 124 123 122 121 120
  6. 124 125 123 122 121 120
  7. 124 125 123 126 122 121 120
  8. 124 125 123 126 122 127 121 120
  9. 124 125 123 126 122 127 121 128 120
  10. 620
复制代码
一开始我还检测了指针的值,也是正确的,没有问题。包括其销毁过程,全部正确,获取的数值也正确。
可是使用G++进行编译
  1. lhl@ubuntu:~/imp$ ulimit -c unlimited
  2. lhl@ubuntu:~/imp$ g++ -g test.cpp -o test
  3. lhl@ubuntu:~/imp$ ./a.out
  4. 段错误 (核心已转储)
  5. lhl@ubuntu:~/imp$ gdb test core
复制代码
就会出现段错误。
调试core信息如下:
  1. warning: core file may not match specified executable file.
  2. [New LWP 1667]

  3. warning: Can't read pathname for load map: 输入/输出错误.
  4. Core was generated by `./a.out'.
  5. Program terminated with signal 11, Segmentation fault.
  6. #0  0x0000000000400b60 in getknnval (p=0x7fff20daf600, a=124) at test.cpp:82
  7. 82                        cout<<pix->val<<endl;
复制代码
调试core的运行,也是正确的,这是为什么?球找出错误。。。

论坛徽章:
0
2 [报告]
发表于 2014-05-07 14:51 |只看该作者
编译环境为64位 ubuntu 12.10
g++和gcc版本均为4.7.2

论坛徽章:
0
3 [报告]
发表于 2014-05-07 15:18 |只看该作者
本帖最后由 komakoh 于 2014-05-07 15:19 编辑

难道是我的编译环境有问题?
  1. #include "iostream"
  2. #include "cstdlib"
  3. #include "cstdio"

  4. using namespace std;

  5. int main()
  6. {
  7.         int* p;
  8.         p=new int(0);
  9.         cout<<p<<endl;
  10.         return 0;
  11. }
复制代码
此段代码依然有段错误。。。

论坛徽章:
0
4 [报告]
发表于 2014-05-07 15:21 |只看该作者
草。。。重启了一下。。。好了。。。我日。。。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
5 [报告]
发表于 2014-05-07 17:10 |只看该作者
是不是升级系统来着?

论坛徽章:
0
6 [报告]
发表于 2014-05-07 17:55 |只看该作者
回复 5# zhaohongjian000


    系统在update。。。没管。。。一直艹着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
7 [报告]
发表于 2014-05-08 09:18 |只看该作者
没看代码,难道有未初始化导致的随机问题?

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
8 [报告]
发表于 2014-05-08 09:54 |只看该作者
应该不是系统升级的问题。

论坛徽章:
0
9 [报告]
发表于 2014-05-08 10:22 |只看该作者
回复 8# fender0107401
重启完就完美运行了。。。毫无差错。。。


   

论坛徽章:
0
10 [报告]
发表于 2014-05-08 10:23 |只看该作者
回复 7# hellioncu
应该不是,我并没有访问0指针,内存的越界也不存在。。。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP