gpt4 book ai didi

c - 我收到 "pointer being freed was not allocated"

转载 作者:行者123 更新时间:2023-11-30 16:57:14 25 4
gpt4 key购买 nike

我正在从标准输入读取内容。由于我不知道要读的内容的长度,所以我必须使用 malloc。

我得到一个被释放的指针未分配

有时,它发生在 free(final) 之前,有时发生在 free(tmp) 之前。

我检查两个指针​​在创建之后和释放之前是否正确且不为空。有人可以指出我做错了什么吗?

total_size = 0;
final = (char *)malloc(sizeof(char) * 1);
if (!final)
{
printf("Error Allocating Memory for final\n");
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 tmp\n");
return (NULL);
}
strcpy(tmp, final);
if (final)
free(final);
buf[ret] = '\0';
total_size = total_size + ret;
final = (char *)malloc(sizeof(char) * total_size);
if (!final)
{
printf("Error Allocating Memory for final\n");
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。此后您可以释放其中一个,但在没有先重新分配另一个以指向有效的动态分配 block 的情况下,您不得随后释放另一个。

总的来说,您似乎会因 tmp 遇到很多不必要的麻烦。据我所知,您只是想增加 final 指向的 block 的大小,这就是 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] = '\0';

// strcat is wasteful if you already know the destination string's length
strcpy(final + total_size, buf);
total_size += ret;

重新分配的 block 可能会也可能不会在与原始 block 相同的位置开始,但如果需要,realloc() 会负责复制数据。

关于c - 我收到 "pointer being freed was not allocated",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com