免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: kingjwj
打印 上一主题 下一主题

(绝对难题)高手帮忙看看,malloc出线段错误 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-01-14 13:12 |只看该作者
原帖由 wyaccent 于 2007-1-14 13:00 发表
p1->event = p2->event;
上面一句可以改成 memcpy (&(p1->event), &(p2->event), sizeof (EVENT));

而且说了,你最后的p1->aipinf.front = ptr;想把合并以后的内容传出去是不行的,你 ...

这个还是不懂,我没有改变p1的指针地址,我只是改变p1中的成员变量,我觉得函数外访问p1,应该可以得到相应改变的内容吧?
如果改变的是p1本身指针地址,那要带出去是需要定义**p,我的理解没有错吧?

还有我的程序需要追加内存,除了用realloc之外,有没有替代的方法??
就是要将一些新的内容与原来的合并.

论坛徽章:
0
22 [报告]
发表于 2007-01-14 13:23 |只看该作者
不知道你定义的结构的用意,为何用了如此多的指针
而且都没有分配内存,而是通过malloc,和realloc来动态申请。
我们大家也只能凭猜测来帮你解决问题

论坛徽章:
0
23 [报告]
发表于 2007-01-14 13:32 |只看该作者
指针多,是程序需要,我也没办法.
其实我动态申请的也就只有一项内容,就是aipinf里的front指向的内容,这个指针连接着很多数据,需要的时候还要给他追加内存.但又不能给他固定分配一个很大的空间,因为有很多这样的结构,会占用非常大的空间,所以只能需要的时候进行申请,用完了之后释放.

不过还是非常感谢大家的热心帮助,启发了我很多.

论坛徽章:
0
24 [报告]
发表于 2007-01-14 14:00 |只看该作者
程序跑了将近一个小时,又出错了
还是memcpy那里,我在之前打印输出p2->aipinf.size竟然是个负数,我再找找这是为什么.
-2 -2 -2,p2->aipinf.front:80523b0p2->aipinf.size:-1073748092

Program received signal SIGSEGV, Segmentation fault.
0x4207c1ac in memcpy () from /lib/tls/libc.so.6

论坛徽章:
0
25 [报告]
发表于 2007-01-14 15:21 |只看该作者
能把程序的作用、写代码时候的思路讲讲吗?我还没明白这个函数的作用。

论坛徽章:
0
26 [报告]
发表于 2007-01-14 15:43 |只看该作者
大概说一下吧p2->aipinf.size,在这里,p2是一个结构体的指针,aipinf是结构体成员之一,aipinf的定义前面已经给出来了.其实整个程序就是要维护大量的链表结构,涉及到很多插入,删除,更新,合并操作,很多链表是共用节点的.所有炼表节点是程序启动是预先申请好的.
而我在程序中涉及的malloc等是因为对于炼表节点的操作中涉及到数据的保存,删除等.
关于项目的事我也不能说太多呀,对不起了.
现在改了一个错误,就是根据GDB出错提示,以及打印输出,p2->aipinf.size出现了负数,现在已经找到错误,逻辑错误.
改完之后,程序正在跑,目前还没什么问题.
我想问一下,对于这种结构复杂的链表操作,有什么好方法可以跟踪程序的运行情况??
就是如何尽量全面的测试程序的正确性??

论坛徽章:
0
27 [报告]
发表于 2007-01-15 15:40 |只看该作者
写的是啥哦,q第一次分配内存后使用过吗 q = (struct in_addr *)malloc(100 * sizeof(struct in_addr));
?第二次分配q = (struct in_addr *)malloc(400);怎么又是直接400?混乱

论坛徽章:
0
28 [报告]
发表于 2007-01-15 15:42 |只看该作者
建议楼主多学下数据结构和算法吧,这样就去开发程序会整死人的

论坛徽章:
0
29 [报告]
发表于 2007-01-15 16:20 |只看该作者
原帖由 weiqiboy 于 2007-1-15 15:40 发表
写的是啥哦,q第一次分配内存后使用过吗 q = (struct in_addr *)malloc(100 * sizeof(struct in_addr));
?第二次分配q = (struct in_addr *)malloc(400);怎么又是直接400?混乱

不是那样的,这个是后来改的,刚开始提示malloc段错误,就一直在改,刚开始怀疑是大小有问题,就直接写了400长度.

现在程序运行情况良好,从做天下午一直跑到现在都没出现问题.
可以结帖了.

总结一下:
(1) 对于memcpy等的内存操作,注意长度的截取
(2) 对于涉及内存分配与操作的,养成良好的书写习惯,比如内存申请之前指针变量赋值NULL,申请内存之后判断是否成功;free之前判断内存是否为NULL,free之后指针变量赋值NULL,防止出现野指针.
(3) 程序逻辑的正确.

再次感谢这么多热心的朋友,wyaccent ,langue ,linternt ,direstrait ,weiqiboy等等朋友.
(注:排名基本分先后)

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-05-28 06:20:00
30 [报告]
发表于 2007-01-15 20:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP