免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5716 | 回复: 9

结构体的成员是指针,free的时候出问题,想不通,上来问问 [复制链接]

论坛徽章:
0
发表于 2012-04-06 09:15 |显示全部楼层
本帖最后由 herocsz 于 2012-04-06 09:31 编辑

写了个测试代码,编译通过,运行时,在最后free的时候报错:free(): invalid next size(fast): 0x09c22008。
但是把其中给结构体成员malloc的那两行注释掉,free不报错,这问题出在哪里?
全部源代码如下:

#define CALLOC_TYPEDEF(size)  (void *) calloc(1, sizeof(size))

typedef struct
{
        char ser_ip[16];
        char *name;
        size_t name_length;       
        unsigned char type;
        void *value;
        size_t value_len;
}S_SNMP_PACK, *PS_SNMP_PACK;

int main(void)
{
        PS_SNMP_PACK p_ret = NULL;
       
        p_ret = (PS_SNMP_PACK)CALLOC_TYPEDEF(sizeof(S_SNMP_PACK));
        if(!p_ret)
        {
                printf("p_ret malloc err\n");
        }
       
        p_ret->name = (char*)CALLOC_TYPEDEF(sizeof(char)); //这行注释掉,free不出错。
        p_ret->value = (char*)CALLOC_TYPEDEF(sizeof(char)); //这行注释掉,free不出错。
      

       
        printf("-Addr->        ser_ip=0x%X\n name=0x%X\n name_length=0x%X\n        type=0x%X\n value=0x%X\n value_len=0x%X\n\n",
         &p_ret->ser_ip, &p_ret->name, &p_ret->name_length, &p_ret->type, &p_ret->value, &p_ret->value_len);
       
        char ip[16] = "255.255.255.255";
        char name[] = "snmptrap";
        char val[] = "AP01&admin&06-A4-DE-B4-7F-C0&1&-60&AP02&&F8-D1-11-E4-41-94&1&-65&";
       
        //以下把内容拷贝
        memcpy(p_ret->ser_ip, ip, sizeof(ip));
        p_ret->name = strdup(name);
        p_ret->name_length = strlen(p_ret->name);
        p_ret->type = ASN_OCTET_STR;
        p_ret->value = strdup(val);
        p_ret->value_len = strlen(p_ret->value);       
       
        printf("=结果内容=> ser_ip=%s\n        name=%s\n name_length=%d\n        type=0x%02X\n value=%s\n value_len=%d\n\n",
        pSnmpack->ser_ip, pSnmpack->name, pSnmpack->name_length, pSnmpack->type, pSnmpack->value, pSnmpack->value_len);       
       
        free(p_ret);
}



论坛徽章:
0
发表于 2012-04-06 09:17 |显示全部楼层
本帖最后由 herocsz 于 2012-04-06 09:23 编辑

//下面是该代码运行的结果,从打印出来的信息上看,内容正确被拷贝了

-Addr->        ser_ip=0x87BD008
        name=0x87BD018
        name_length=0x87BD01C
        type=0x87BD020
        value=0x87BD024
        value_len=0x87BD028

=结果内容=>        ser_ip=255.255.255.255
        name=snmptrap
        name_length=8
        type=0x04
        value=AP01&admin&06-A4-DE-B4-7F-C0&1&-60&AP02&&F8-D1-11-E4-41-94&1&-65&
        value_len=294

//以下的报错的内容,在free(p_net)的时候出错
*** glibc detected *** ./t4: free(): invalid next size (fast): 0x087bd008 ***
======= Backtrace: =========



论坛徽章:
0
发表于 2012-04-06 09:38 |显示全部楼层
本帖最后由 herocsz 于 2012-04-06 09:38 编辑

问题解决了,

我把CALLOC_TYPEDEF换成malloc,然后在3个malloc之后面增加memset(p_ret, 0, sizeof(S_SNMP_PACK)); 运行就成功了。

但是不知道这是为什么?请哪位说说这是什么情况!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2012-04-06 09:38 |显示全部楼层
看第一句就晕了
#define CALLOC_TYPEDEF(size)  (void *) calloc(1, sizeof(size))
却是这么使用的
p_ret = (PS_SNMP_PACK)CALLOC_TYPEDEF(sizeof(S_SNMP_PACK));

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2012-04-06 09:43 |显示全部楼层
太乱七八糟了,比如
p_ret->name = (char*)CALLOC_TYPEDEF(sizeof(char));
……
p_ret->name = strdup(name);

都不知道你到底要哪个?

论坛徽章:
0
发表于 2012-04-06 09:48 |显示全部楼层
strdup自带分配内存功能,不用先malloc

在最后要free(p_ret->name);
free(p_ret->value);
free(p_ret);

论坛徽章:
0
发表于 2012-04-06 10:01 |显示全部楼层
感谢楼上,那为什么calloc换成malloc就执行成功了呢?

论坛徽章:
0
发表于 2012-04-06 10:05 |显示全部楼层
本帖最后由 herocsz 于 2012-04-06 10:07 编辑
bruceteen 发表于 2012-04-06 09:38
看第一句就晕了
#define CALLOC_TYPEDEF(size)  (void *) calloc(1, sizeof(size))
却是这么使用的
p_ret = (PS_SNMP_PACK)CALLOC_TYPEDEF(sizeof(S_SNMP_PACK));


多谢,用错了,没看出来

p_ret = (PS_SNMP_PACK)CALLOC_TYPEDEF(S_SNMP_PACK);

论坛徽章:
0
发表于 2012-04-06 10:11 |显示全部楼层
原来是宏定义和用法的不匹配导致的错误,多谢。
看来代码还是“晒晒更健康啊!”

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
发表于 2012-04-06 10:19 |显示全部楼层
分配空间可以用malloc();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP