免费注册 查看新帖 |

Chinaunix

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

调用free()的时候会出现段错误么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-13 13:51 |只看该作者 |倒序浏览
我在linux下面写一个程序, 在调用free(p)的时候出现了段错误。 大概的可能原因是什么呢。
p不是空指针。
[code]int SendCns(pCns_packet_t pCns_packet, pInstSierialport_t SerialInstance)
{
        int retval = 0;
        whip_packet_t whip_packet;
        char *dest_buf = NULL, *src_buf = pCns_packet->arameter;
        int i;
        int bufsize = pCns_packet->;payloadlenth + 10;/* put Cns packet and it's payload in a memory block */
        INFUNCTION;
        if((dest_buf = (char *)malloc(bufsize)) == NULL){
                fprintf(stderr, "unable to malloc for Cns packet memory block\n";
                return -1;
        }
        printf("bufsize is %d\n", bufsize);
        bzero(&whip_packet, sizeof(whip_packet));
        bzero(dest_buf, bufsize);

        PrintCnsPacket(pCns_packet);
        dest_buf[0] = (char) ((pCns_packet->;ObjectID & 0xFF00) >;>; ;
        dest_buf[1] = (char) (pCns_packet->;ObjectID & 0x00FF);
        dest_buf[2] = (char) pCns_packet->;OperationType;
        dest_buf[3] = (char) pCns_packet->;Reserved;
        dest_buf[4] = (char) ((pCns_packet->;AppID & 0xFF000000) >;>; 24);
        dest_buf[5] = (char) ((pCns_packet->;AppID & 0x00FF0000) >;>; 16);
        dest_buf[6] = (char) ((pCns_packet->;AppID & 0x0000FF00) >;>; ;
        dest_buf[7] = (char) ((pCns_packet->;AppID & 0x000000FF));
        dest_buf[8] = (char) ((pCns_packet->;payloadlenth& 0xFF00) >;>; ;
        dest_buf[9] = (char) (pCns_packet->;payloadlenth& 0x00FF);

        for(i = 0; i < pCns_packet->;payloadlenth; i++){
                dest_buf[i + 10] = src_buf[i];
        }

        whip_packet.Optionpayload = dest_buf;
        whip_packet.Startframe = WHIP_FRAME;
        whip_packet.payloadlenth = pCns_packet->;payloadlenth+ 10;
        whip_packet.MessageID = WHIP_MSG_HOST2MODEM;
        whip_packet.Parameter = WHIP_PARA_CNS_NULL;
        whip_packet.Endframe = WHIP_FRAME;

        retval = SendWHIP(&whip_packet, SerialInstance);

        printf("whip_packet.Optionpayload: %#X, dest_buf : %#X\n", (int)whip_packet.Optionpayload, (int)dest_buf);
        printf("after send whip\n";
        printf("bufsize is %d\n", bufsize);

        free(dest_buf);/* ======== segment error=======*/

        printf("after free dest_buf\n";
        if(retval < 0){
                return retval;
        }
        EXITFUNCTION;
        return 0;
}

[/code]

论坛徽章:
0
2 [报告]
发表于 2005-06-13 17:38 |只看该作者

调用free()的时候会出现段错误么

同疑惑
SirFang 该用户已被删除
3 [报告]
发表于 2005-06-13 18:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
SirFang 该用户已被删除
4 [报告]
发表于 2005-06-13 18:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2005-06-13 22:26 |只看该作者

调用free()的时候会出现段错误么

[quote="SirFang"]越界,这段程序看不出来,所以请确认src_buf的访问是否越界。[/quote]
给大家添麻烦了。
src_buf访问应该不会越界。我仔细打印过src_buf的内容。
现在已知的现象是如果减小bufsize,那么不出现问题。

我来说明一下:这个函数会被调用很多次,也就是说会申请和释放内存很多次。 前10几次调用时申请的内存大小一直是10, 出错的时候申请的内存大小是198。
经过试验,如果我减小前面申请大小为10的调用次数,那么就不会出错。

因此我想是不是有这样的问题,一个进程在多次反复申请同样大小的内存空间并释放之后,突然申请一个很大的空间会不会出问题。
我的系统是linux redhat9 2.4, gcc 3.3.3.

论坛徽章:
0
6 [报告]
发表于 2005-06-14 01:45 |只看该作者

调用free()的时候会出现段错误么

楼主搞笑了, malloc/free恐怕是用得最频繁的系统调用. 不会有你怀疑的问题.

建议试一试.
>; export MALLOC_CHECK_=2; myprogram
或 >; ef myprogram
或 >; export EF_PROTECT_BELOW=1; ef myprogram
或 >; export EF_PROTECT_FREE; ef myprogram

论坛徽章:
0
7 [报告]
发表于 2005-06-14 13:18 |只看该作者

调用free()的时候会出现段错误么

还是怀疑 src_buf在重复调用多次后是否会越界?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP