鱼C论坛

 找回密码
 立即注册
查看: 873|回复: 8

[已解决]课后写的一个挖字符函数,但是内存释放出现了问题,一释放就报错

[复制链接]
发表于 2020-3-24 12:03:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int spitString(const char *mytmp, char c, char ***mybuf, int *num)
{
        int cls = 0;
        if (mytmp == NULL || num == NULL)
        {
                cls = -1;
                printf("func spitString() err:%d (mytmp == NULL || num == NULL)  \n", cls);
                goto END;
        }
        char *p1 = mytmp;
        int count = 0;
        while (p1 = strchr(p1, ','))
        {
                count++;
                p1++;
        }
        char **pp = NULL;
        pp = (char **)malloc(count * sizeof(char *));
        if (pp == NULL)
        {
                cls = -2;
                printf("func spitString() err:%d count * sizeof(char *)\n", cls);
                goto END;
        }
        char *p = NULL, *ptmp = NULL;
        count = 0;
        p = mytmp;
        ptmp = mytmp;
        int len = p - ptmp + 1;
        do
        {
                p = strchr(p, c);
                if (p != NULL)
                {
                        if (p - ptmp > 0)
                        {
                                pp[count] = (char *)malloc(len * sizeof(char));
                                if (pp[count] == NULL)
                                {
                                        cls = -3;
                                        printf("func spitString() err:%d (char *)malloc(len * sizeof(char))", cls);
                                        goto END;
                                }
                                strncpy(pp[count], ptmp, p - ptmp);
                                pp[count][p - ptmp] = '\0';
                                count++;
                                ptmp = p = p + 1;
                        }
                }
                else
                {
                        break;
                }
        } while (*p!='\0');
END:
        if (cls != 0)
        {
                if (pp == NULL)
                {
                        return -4;
                }
                Free_String(&pp, count);
        }
        else
        {
                *num = count;
                *mybuf = pp;
        }
        return cls;
}

void Free_String(char ***mybuf, int num)
{
        if (mybuf == NULL)
        {
                return;
        }
        int i;
        char **tmp = NULL;
        tmp = *mybuf;
        if (tmp == NULL)
        {
                return;
        }
        for (i = 0; i < num; i++)
        {
                if (tmp[i] != NULL)
                {
                        free(tmp[i]);
                }
        }
        if (tmp != NULL)
        {
                free(tmp);
        }
        *mybuf = NULL;
}

int main()
{
        int cls = 0;
        char tmp[100] = { "abcdef,acccd,eeee,aaaa,e3eeee,ssss," };
        char c = ',';
        int num = 0, i;
        char **buf = NULL;
        cls = spitString(tmp, c, &buf, &num);
        if (cls != 0)
        {
                printf("fucn spitString() err:%d \n", cls);
                return cls;
        }
        for (i = 0; i < num; i++)
        printf("%s \n", buf[i]);
        printf("%d \n", num);
        for (i = 0; i < num; i++)
        {
                if (buf[i] != NULL)
                {
                        free(buf[i]);
                        buf[i] = NULL;
                }
        }
        if (buf != NULL)
        {
                free(buf);
                buf = NULL;
        }
        //Free_String(&buf, num);
        return cls;
}
最佳答案
2020-3-24 17:21:45
改了好多地方
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Free_String(char **mybuf, int num)
{
    if(mybuf == NULL)
        return;
    for(int i = 0; i < num; ++i) {
        free(mybuf[i]);
    }
    free(mybuf);
}

int spitString(const char *mytmp, char c, char ***mybuf, int *num)
{
    if(mytmp == NULL || num == NULL)
        return -1;
    const char *p1 = mytmp;
    int count = 0;
    while(p1 = strchr(p1, ','))
    {
        count++;
        p1++;
    }
    ++count;
    char **pp = NULL;
    pp = malloc(count * sizeof(char *));
    if(pp == NULL)
    {
        *mybuf = pp;
        return -2;
    }
    const char *p = mytmp, *q;
    for(int i = 0; i < count; ++i)
        pp[i] = NULL;
    for(int i = 0; i < count; ++i) {
        q = strchr(p, c);
        if(!q) q = p + strlen(p);
        pp[i] = malloc(q - p + 1);
        if(!pp[i]) return -3;
        strncpy(pp[i], p, q - p);
        pp[i][q - p] = '\0';
        p = q + 1;
    }
    *mybuf = pp;
    *num = count;
    return 0;
}

int main(void)
{
    int cls = 0;
    char tmp[100] = {"abcdef,acccd,eeee,aaaa,e3eeee,ssssa,"};
    char c = ',';
    int num = 0, i;
    char **buf = NULL;
    cls = spitString(tmp, c, &buf, &num);
    if(cls != 0)
    {
        printf("fucn spitString() err: %d\n", cls);
        return cls;
    }
    for(i = 0; i < num; i++)
        printf("%s\n", buf[i]);
    printf("%d\n", num);
    Free_String(buf, num);
    return cls;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-24 12:05:09 | 显示全部楼层
找了很久都没找到错误出在什么地方,好打击信心啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 17:21:45 | 显示全部楼层    本楼为最佳答案   
改了好多地方
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Free_String(char **mybuf, int num)
{
    if(mybuf == NULL)
        return;
    for(int i = 0; i < num; ++i) {
        free(mybuf[i]);
    }
    free(mybuf);
}

int spitString(const char *mytmp, char c, char ***mybuf, int *num)
{
    if(mytmp == NULL || num == NULL)
        return -1;
    const char *p1 = mytmp;
    int count = 0;
    while(p1 = strchr(p1, ','))
    {
        count++;
        p1++;
    }
    ++count;
    char **pp = NULL;
    pp = malloc(count * sizeof(char *));
    if(pp == NULL)
    {
        *mybuf = pp;
        return -2;
    }
    const char *p = mytmp, *q;
    for(int i = 0; i < count; ++i)
        pp[i] = NULL;
    for(int i = 0; i < count; ++i) {
        q = strchr(p, c);
        if(!q) q = p + strlen(p);
        pp[i] = malloc(q - p + 1);
        if(!pp[i]) return -3;
        strncpy(pp[i], p, q - p);
        pp[i][q - p] = '\0';
        p = q + 1;
    }
    *mybuf = pp;
    *num = count;
    return 0;
}

int main(void)
{
    int cls = 0;
    char tmp[100] = {"abcdef,acccd,eeee,aaaa,e3eeee,ssssa,"};
    char c = ',';
    int num = 0, i;
    char **buf = NULL;
    cls = spitString(tmp, c, &buf, &num);
    if(cls != 0)
    {
        printf("fucn spitString() err: %d\n", cls);
        return cls;
    }
    for(i = 0; i < num; i++)
        printf("%s\n", buf[i]);
    printf("%d\n", num);
    Free_String(buf, num);
    return cls;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 22:17:57 | 显示全部楼层
谢谢大神,不过我编译器用的VS2013,直接malloc会报错,我将你的答案又处理了下,内存完美释放,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-24 22:55:39 | 显示全部楼层
臭屁含 发表于 2020-3-24 22:17
谢谢大神,不过我编译器用的VS2013,直接malloc会报错,我将你的答案又处理了下,内存完美释放,感谢{:9_22 ...

后缀是 .cpp  ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 23:42:21 | 显示全部楼层

是的呀,我感觉.cpp跟.c没啥区别就懒得改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-24 23:46:09 | 显示全部楼层
臭屁含 发表于 2020-3-24 23:42
是的呀,我感觉.cpp跟.c没啥区别就懒得改了

刚才我仔细对照了下我之前写的代码,终于发现了问题,函数内定义的那个int len值是错的,造成malloc内存出错,不能释放内存,我将int len放到了指针p赋值之后,问题解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 02:14:27 | 显示全部楼层
臭屁含 发表于 2020-3-24 23:42
是的呀,我感觉.cpp跟.c没啥区别就懒得改了

就用我的代码,不要修改
你换成 .c 看看能不能编译过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 02:15:11 | 显示全部楼层
臭屁含 发表于 2020-3-24 23:46
刚才我仔细对照了下我之前写的代码,终于发现了问题,函数内定义的那个int len值是错的,造成malloc内存 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表