【发布时间】:2021-06-24 12:05:06
【问题描述】:
-
我写了一个程序来根据特定的分隔符分割给定的字符串。一切工作正常,但
valgrind中存在泄漏和错误。 -
split算法正确。 -
substr工作正常。 -
我的程序:
#include <stdio.h>
#include <stdlib.h>
char** split(const char*, char, int*);
char* substr(const char*, int, int);
void freepath(char**, int);
int main(void) {
char *str = "home///ubuntu//Desktop";
char **path = NULL;
int size = 0;
path = split(str, '/', &size);
freepath(path, size);
return 0;
}
char** split(const char *str, char c, int *size) {
char **path = NULL;
const char *save = str;
int from=-1, i;
if(str == NULL)
return NULL;
for(i=0 ; 1; ++i) {
if(*str == '\0') {
if(from != -1) {
++(*size);
path = (char**)realloc(path, (sizeof(char**) *(*size)));
*(path+(*size)-1) = substr(save, from, i);
}
break;
}
if(*str != '/') {
if(from == -1)
from = i;
}
else {
if(from != -1) {
++(*size);
path = (char**)realloc(path, (sizeof(char)*(*size)));
*(path+(*size)-1) = substr(save, from, i);
}
from = -1;
}
++str;
}
return path;
}
void freepath(char **path, int size) {
int i=0;
for(i=0; i<size; ++i) {
free(*(path+i));
*(path+i) = NULL;
}
free(path);
path = NULL;
}
char* substr(const char *src, int m, int n)
{
int len = n - m;
char *dest = (char*)malloc(sizeof(char) * (len + 1));
for (int i = m; i < n && (*(src + i) != '\0'); i++)
{
*dest = *(src + i);
++dest;
}
*dest = '\0';
return dest - len;
}
【问题讨论】:
-
substr() 看起来......片状。你在 mallocing 后改变 'dest' 。您绝对确定 substr() 总是返回您分配的指针吗?如果没有,那么你已经泄露了分配......你不能复制'dest'来返回吗?
-
split()可以使用strtok()更轻松地实现。 -
BTW,
*(x+i)等价于x[i],后者更容易理解。 -
path = (char**)realloc(path, (sizeof(char)*(*size)));--> 尺寸错误。试试path = realloc(path, sizeof *path * *size); -
substr()中的循环可以替换为strncpy()。这是实际上正确功能的少数情况之一。
标签: c split memory-leaks valgrind realloc