我正在从stdin中读取。因为我不知道我要读取的内容的长度,所以我必须使用malloc。
我得到一个指针被释放,但没有分配
有时在free(final)之前,有时在free(tmp)之前。
在创建指针之后和释放指针之前,我检查两个指针是否正确地是非空的。有人能指出我做错了什么吗?
total_size = 0;
final = (char *)malloc(sizeof(char) * 1);
if (!final)
{
printf("Error Allocating Memory for finaln");
return (NULL);
}
while ((ret = read(0, buf, BUF_SIZE)) > 0)
{
tmp = (char *)malloc(sizeof(char) * ft_strlen(final));
if (!tmp)
{
printf("Error Allocating Memory for tmpn");
return (NULL);
}
strcpy(tmp, final);
if (final)
free(final);
buf[ret] = ' ';
total_size = total_size + ret;
final = (char *)malloc(sizeof(char) * total_size);
if (!final)
{
printf("Error Allocating Memory for finaln");
return (NULL);
}
final = strcat(tmp, buf);
if (tmp)
free(tmp);
}
return (final);
这对你来说是个问题:
final = (char *)malloc(sizeof(char) * total_size);
[…]
final = strcat(tmp, buf);
您正在泄漏分配的内存并混淆*final
和*tmp
。此后可以释放其中一个,但在释放另一个之后,必须先将其重新分配给指向一个有效的动态分配块的对象。
总的来说,看起来你用tmp
会遇到很多不必要的麻烦。据我所知,你只是想增加final
所指向的块的大小,这就是realloc()
的作用:
size_t desired_size = total_size + ret + 1; // need space for a terminator
char *tmp = realloc(final, desired_size);
if (!tmp) {
perror("Error Allocating More Memory for final");
// realloc() does not free the pointer on failure; at least GLIBC's doesn't
free(final);
return (NULL);
}
final = tmp;
buf[ret] = ' ';
// strcat is wasteful if you already know the destination string's length
strcpy(final + total_size, buf);
total_size += ret;
重新分配的块可以从原始块的位置开始,也可以不从原始块的位置开始,但是realloc()
会在必要时复制数据。
我相信当谈到指针时你会有点困惑。当你写
final = (char *)malloc(sizeof(char) * total_size);
分配相当于sizeof(char) * total_size
的内存,然后malloc返回指向该内存的指针。然后继续写
final = strcat(tmp, buf);
返回一个指针。用malloc(...)
分配的内存从未使用过。因此,当您之后尝试if (final) free(final);
时,您并没有释放已分配的内存。
只是注释
if (final)
free(final);
和
final = (char *)malloc(sizeof(char) * total_size);
if (!final){
printf("Error Allocating Memory for finaln");
return (NULL);
}
删除了双自由错误。希望对大家有所帮助