免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2007-01-14 11:06 |只看该作者
原帖由 direstrait 于 2007-1-13 22:58 发表
这类问题并不是malloc本身出错了,而是应用程序越界写坏了内存管理结构字段,导致出现异常。

PC_LINT做一做,如果有Purify就更简单了。

什么是PC_LINT或者Purify呀??是内存检测工具吗 ??
有没有使用方法介绍?以前没接触过.

我觉得测试这种内存段错误,是不是应该有一些检测方法呀??

多谢各位大虾帮忙了.

论坛徽章:
0
12 [报告]
发表于 2007-01-14 11:14 |只看该作者
大家帮忙看一下,我也怀疑是不是像wyaccent 兄所说的内存截取出错呀???
q = (struct in_addr *)realloc(ptr->aipinf.front, sizeof(struct in_addr)*len);
memcpy(q+sizeof(struct in_addr)*(ptr->aipinf.size), longip, sizeof(struct in_addr)*(head->count-1));


q+sizeof(struct in_addr)*(ptr->aipinf.size),这个写法有问题吗????

论坛徽章:
0
13 [报告]
发表于 2007-01-14 12:28 |只看该作者
有了新错误
GDB提示:
CombineWRDList CombineWRDList CombineWRDList
00000000000000000000
-1-1-1-1-1-1-1-1-

Program received signal SIGSEGV, Segmentation fault.
0x4207c1ac in memcpy () from /lib/tls/libc.so.6
(gdb) bt
#0  0x4207c1ac in memcpy () from /lib/tls/libc.so.6
#1  0x08049501 in CombineWRDList (p1=0x4, p2=0xbffff304) at event_list.c:375
#2  0x0804b75a in main (argc=4, argv=0xbffff304) at main.c:826
#3  0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
(gdb)

我的函数:
void CombineWRDList(WREVENT_DNODE *p1, EVENT_DNODE *p2)
{
        long count;
        int len;
        struct in_addr *ptr;
        count = p1->event.count;
        len = (p1->aipinf.size + p2->aipinf.size);
        p1->event = p2->event;
        p1->event.count = p1->event.count + count;
       
        printf("CombineWRDList CombineWRDList CombineWRDList\n");
        printf("00000000000000000000\n");
        if(p1->aipinf.front != NULL)
        {
                ptr = (struct in_addr *)realloc(p1->aipinf.front, sizeof(struct in_addr)*len);
                printf("-1-1-1-1-1-1-1-1-\n");
                memcpy(ptr+(p1->aipinf.size), p2->aipinf.front, sizeof(struct in_addr)*(p2->aipinf.size));   //我把ptr的偏移位置改了,没有乘sizeof(struct in_addr)
                printf("11111111111111\n");
                p1->aipinf.front = ptr;
                printf("22222222\n");
                p1->aipinf.size = len;
                if(p2->aipinf.front != NULL)
                {
                        free(p2->aipinf.front);
                        p2->aipinf.front = NULL;
                        printf("33333333333\n");
                }
        }
        else
        {
                p1->aipinf.front = p2->aipinf.front;
                p2->aipinf.front = NULL;
                printf("44444444444444\n");
                p1->aipinf.size = len;
        }
        p2->aipinf.size = 0;
       
        printf("5555555555555555555\n");
}

现在GDB提示出错在memcpy,大家看看什么原因.

论坛徽章:
0
14 [报告]
发表于 2007-01-14 12:33 |只看该作者
补充问一下,如果memcpy里的第二个参数p2->aipinf.front为NULL会不会出错???

论坛徽章:
0
15 [报告]
发表于 2007-01-14 12:43 |只看该作者
原帖由 kingjwj 于 2007-1-14 11:06 发表

什么是PC_LINT或者Purify呀??是内存检测工具吗 ??
有没有使用方法介绍?以前没接触过.

我觉得测试这种内存段错误,是不是应该有一些检测方法呀??

多谢各位大虾帮忙了.


对代码进行检测,把语法之外的错误尽量找出来。

论坛徽章:
0
16 [报告]
发表于 2007-01-14 12:44 |只看该作者
q+sizeof(struct in_addr)*(ptr->aipinf.size),这个写法有问题吗????


q已经是一个结构体指针了,对它的+操作就是移动到下一结构体处,所以这个sizeof(struct in_addr)*还有什么意义吗?

另外,关于使用realloc函数的问题,我以前遇到过,是两种不同的操作系统环境,realloc很多次,一个系统没事,另一个系统就会出现非法内存访问的问题,后来很少用这个函数了。

[ 本帖最后由 linternt 于 2007-1-14 12:46 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2007-01-14 12:47 |只看该作者
原帖由 kingjwj 于 2007-1-14 12:33 发表
补充问一下,如果memcpy里的第二个参数p2->aipinf.front为NULL会不会出错???


这样的问题如果不看MAN手册的话,就写个测试程序试一下最好了,几行代码搞定!

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

而且说了,你最后的p1->aipinf.front = ptr;想把合并以后的内容传出去是不行的,你写个小程序测试一下就知道了

论坛徽章:
0
19 [报告]
发表于 2007-01-14 13:02 |只看该作者
memcpy是不会报错的,第一个参数目标一个地址,第二个参数源地址,第三个参数长度

就是拷贝内存,不管你的内存里面是什么内容,拷贝指定长度

论坛徽章:
0
20 [报告]
发表于 2007-01-14 13:08 |只看该作者
#include <stdio.h>

main ()
{
   char *p;

   malloc_test (p);

   printf ("%s\n", p);
}

malloc_test (char *p)
{
   p = malloc (10);

   strcpy (p, "1234");
}

你觉得MAIN里面打印出来该是什么,我想应该不是你想要的东西,而且内存已经泄漏了
下面的就可以实现

#include <stdio.h>

main ()
{
   char *p;

   malloc_test (&p);

   printf ("%s\n", p);

   free (p);
}

malloc_test (char **p)
{
   (*p) = malloc (10);

   strcpy ((*p), "1234");
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP