免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-13 16:29 |只看该作者 |倒序浏览
程序运行,malloc时竟然出现段错误,高手帮忙分析一下原因吧.
我写的函数
void de_eventip(char *buf, EVENT_DNODE *ptr)
{
        struct in_addr *q,*longip;
        HEAD *head;
//        q = (struct in_addr *)malloc(100 * sizeof(struct in_addr));
        head = (HEAD *)buf;
        printf(" the malloc size is : %d\n", sizeof(struct in_addr)*(head->count-1));
        printf("de_event 1!\n");
        printf("head->count -1 :%d\n",head->count-1);
//        printf(" the malloc size is : %d", sizeof(struct in_addr)*(head->count-1));
        printf("before malloc 1\n");
        printf("before malloc 2\n");
        printf("before malloc 3\n");
        printf("before malloc 4\n");
        printf("before malloc 5\n");
        printf("before malloc 6\n");
        q = (struct in_addr *)malloc(400);
        printf("after malloc 1\n");
        printf("after malloc 2\n");
        printf("after malloc 3\n");
        printf("after malloc 4\n");
        printf("after malloc 5\n");
        printf("after malloc 6\n");
        if(q == NULL)
        {
                printf("return\n");
                return;
        }
        printf("de_event 2!\n");
        longip = (struct in_addr *)(buf + sizeof(HEAD) + sizeof(u_char) + sizeof(EVENT) + sizeof(u_char));
        printf("de_event 3!\n");
        memcpy(q, longip, sizeof(struct in_addr)*(head->count-1));
        printf("de_event 4!\n");
        ptr->aipinf.front = q;
        ptr->aipinf.size = head->count-1;
}

这个程序可以运行一段时间,malloc都没问题,但是过一阵会提示段错误,
printf("before malloc 1\n");
        printf("before malloc 2\n");
        printf("before malloc 3\n");
        printf("before malloc 4\n");
        printf("before malloc 5\n");
        printf("before malloc 6\n");
出错时,这些语句都能正常输出,但是malloc之后的语句不能输出

下面是GDB的出错信息:
the malloc size is : 4
de_event 1!
head->count -1 :1
before malloc 1
before malloc 2
before malloc 3
before malloc 4
before malloc 5
before malloc 6

Program received signal SIGSEGV, Segmentation fault.
0x42074900 in malloc_consolidate () from /lib/tls/libc.so.6
(gdb) bt
#0  0x42074900 in malloc_consolidate () from /lib/tls/libc.so.6
#1  0x420741ec in _int_malloc () from /lib/tls/libc.so.6
#2  0x4207335b in malloc () from /lib/tls/libc.so.6
#3  0x080490a8 in de_eventip (buf=0xbfffe100 "\020\001", ptr=0x8050ce0)
    at event_list.c:247
#4  0x0804a192 in main (argc=4, argv=0xbfffe384) at main.c:338
#5  0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
(gdb)

大家帮忙分析一下.这个函数可以执行多次都没问题.不过多次运行出现的段错误都是在malloc这里.

论坛徽章:
0
2 [报告]
发表于 2007-01-13 17:14 |只看该作者
有没有高手帮忙解决一下吧.
或者大家一起讨论一下,问题到底是出在哪??
是malloc和free没有对应上吗??
我程序中还用了realloc,是不是realloc之后,自动释放了原先的空间??

论坛徽章:
0
3 [报告]
发表于 2007-01-13 19:29 |只看该作者
main.c:338
event_list.c:247


已经告诉你行数了,你检查检查
关键是看不出你的程序想干什么

而且传入的参数是什么?有没有分配过内存多不知道

论坛徽章:
0
4 [报告]
发表于 2007-01-13 19:42 |只看该作者
主函数里调用格式de_eventip(recmsg, ptr);
其实rcmsg是数据缓存,ptr是一个结构体指针.
出错的行数显示就是我上面写的那个函数的那个malloc语句.
我在想可能是我申请空间之后没有释放.就是奇怪为什么能够多次运行之后才出错.
是不是有其他什么原因???

论坛徽章:
0
5 [报告]
发表于 2007-01-13 21:21 |只看该作者
第一次malloc后没有释放,内存泄露了,不过泄漏后的影响是不可预知的

论坛徽章:
0
6 [报告]
发表于 2007-01-13 21:34 |只看该作者
我感觉在我使用完内存后,在该释放的时候都释放对应内存了.
程序有点大,我还要再找找问题.
我查了一些资料,有人说可能是内存操作越界,比如memcpy,我是用到了这个函数,但是我感觉我的操作也没有越界呀.
我贴一下代码:
void de_eventmoreip(char *buf, EVENT_DNODE *ptr)
{
        struct in_addr *q,*longip;
        HEAD *head;
        int len;
        head = (HEAD *)buf;
        longip = (struct in_addr *)(buf + sizeof(HEAD) + sizeof(u_char) + sizeof(EVENT) + sizeof(u_char));
        len = (head->count-1) + ptr->aipinf.size;
        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));
        printf("head->count-1:%d\n",head->count-1);
        ptr->aipinf.front = q;
        ptr->aipinf.size = len;
}
这个内存拷贝没有问题吧???aipinf是一个结构体,有两个成员struct in_addr *front,和int size.

论坛徽章:
0
7 [报告]
发表于 2007-01-13 21:59 |只看该作者
memcpy(q+sizeof(struct in_addr)*(ptr->aipinf.size), longip, sizeof(struct in_addr)*(head->count-1));

感觉这里有问题
你是需要算偏移量对吗
q是指向结构的指针,q+1的地址是不是地址+1,而是指向下一个结构

如果没有猜错的话改成  memcpy(q+ptr->aipinf.size, longip, sizeof(struct in_addr)*(head->count-1));
试试

论坛徽章:
0
8 [报告]
发表于 2007-01-13 22:17 |只看该作者
ptr->aipinf.front = q;
这一句也有问题,你想把动态申请的内存地址的内容传递出去,这样是传递不出去的。

void de_eventmoreip(char *buf, EVENT_DNODE **ptr)
这样才可以

论坛徽章:
0
9 [报告]
发表于 2007-01-13 22:58 |只看该作者

malloc出错导致宕机的问题基本上是你的代码中有越界问题

这类问题并不是malloc本身出错了,而是应用程序越界写坏了内存管理结构字段,导致出现异常。

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

评分

参与人数 1可用积分 +3 收起 理由
langue + 3 经验之谈

查看全部评分

论坛徽章:
0
10 [报告]
发表于 2007-01-14 11:04 |只看该作者
原帖由 wyaccent 于 2007-1-13 22:17 发表
ptr->aipinf.front = q;
这一句也有问题,你想把动态申请的内存地址的内容传递出去,这样是传递不出去的。

void de_eventmoreip(char *buf, EVENT_DNODE **ptr)
这样才可以

aipinf是一个结构体变量,看这个定义:
typedef struct
{
        struct in_addr *front;
        int size;
}AIPINF;

typedef struct event_dnode
{
        EVENT event;
        AIPINF aipinf;
        struct event_dnode *alarm_left;
        struct event_dnode *alarm_right;
        struct event_dnode *lru_left;
        struct event_dnode *lru_right;
}EVENT_DNODE;

front是一个指针变量,这样不能带出来吗 ???
好象是可以的吧??
还有memcpy那个到底是怎么传???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP