在我的方法中使用malloc

时间:2018-06-07 14:00:42

标签: c malloc

嗨,大家好,我一直在努力使用malloc。我写了这个方法,给定一个路径,返回文件名。为此我写了这个:

Order_id| p_id | order_date
----------------------------
    123 |   1  | 2018-01-05
    345 |   2  | 2018-02-06
    678 |   3  | 2018-03-07
    910 |   4  | 2018-01-08
    012 |   3  | 2018-03-04
    234 |   4  | 2018-01-05
    567 |   5  | 2018-02-08
    890 |   6  | 2018-03-09 

我想知道的是,如果文件名,开始和结束需要malloc以避免我的记忆麻烦。一般来说,我想知道,当使用strrchar或strstr时,是否需要分配内存

1 个答案:

答案 0 :(得分:2)

如果你需要返回一个空终止数组而不改变输入path(因为它是const),那么你必须像你一样分配一个新的字符串。并且请记录调用者负责在不再需要时释放它以避免内存泄漏......

但是你的函数实际上做了两个不相关的操作:搜索文件名部分的限制为它的副本分配内存。为了分离关注点(并且为了更简单的测试),我将为第一部分创建一个函数,其中2个输出变量用于文件名部分的开头和结尾:

int getFileName(const char *path, const char **beg, const char **end) {
    *beg = strrchr(path, '/');
    const char *finish;      

    if(*beg){
        *beg += 1;      // just skip over the '/' character
    }
    finish= strrchr(*beg, ".");
    if (NULL == finich) {
        finish = *beg + strlen(*beg)
    }
    if (end != NULL) *end = finish;     // optionaly returns a pointer to the end
    return finish - *beg;  // returns the length of the filename part
}

此处不涉及任何分配,并且调用者将接收指向文件名部分开头的指针,其长度以及如果它传递end的非空指针则可选地指向其结尾的指针。对于许多用例,即使在调用者部分也不需要分配任何内容。