嗨,大家好,我一直在努力使用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时,是否需要分配内存
答案 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
的非空指针则可选地指向其结尾的指针。对于许多用例,即使在调用者部分也不需要分配任何内容。