#include <stdio.h>
#include <stdlib.h>
int main ()
{
char *buffer=malloc(1);
char *temporary=malloc(1);
int length=0;
signed int character;
for(length=0;(character = getchar())!=EOF;length++)
{
buffer[length]=character;
if((length==0) || ((length%1000)==0))
{
temporary=realloc(buffer,length+1001);
if(temporary!=NULL)
{
buffer= temporary;
}
else
{
printf("Error: Out of memory!\n");
free(temporary);
free(buffer);
return 1;
}
}
}
buffer[length]='\0';
length-=1;
while(length>=0)
{
printf("%c",buffer[length]);
length--;
}
printf("\n");
free(buffer);
//////////////free(temporary); //( HERE)
return 0;
}
我的程序应该读取字符串或输入文本文件,存储它,然后向后打印它正在工作。我只是不明白为什么我不能free
结束临时价值。它失败了double free error
。
我想知道为什么我不能把free(temporary)
放在我写“这里”的地方。
如果你想在我的代码中指出另一个问题,我很乐意学习一些东西。
答案 0 :(得分:2)
当此代码执行行
时buffer = temporary;
发生了两件事。首先,buffer
持有的记忆被“泄露”;您不再需要将该地址传递给free()
。其次,buffer
和temporary
现在都指向由malloc()
或realloc()
分配的单个内存。因此,当您在free()
或buffer
上调用temporary
时,您已释放了大块内存;再次致电free()
将是双重免费错误。
我建议这样的事情:
if (length >= buffer_size)
{
const size_t new_size = buffer_size + 1000;
char *temp = realloc(buffer, new_size);
if (!temp)
{
free(buffer);
/* handle the error in some way */
}
buffer = temp;
buffer_size = new_size;
}
此外,最佳实践是实际检查错误。 malloc()
和realloc()
可能会失败。
此外,为每个缓冲区分配单个字节的内存没有多大意义。你可以从分配1000个字节或其他任何东西开始。
此外,您检查缓冲区是否需要realloc()
的方式似乎不必要的棘手。我建议保留一个跟踪缓冲区长度的变量,并在缓冲区不够长时调用realloc()
,然后在realloc()
之后存储到缓冲区。
temporary
感到有些困惑。查看我放置的代码,您将看到我将temp
变量放在if
语句的代码块中。更明显的是temp
将持有多长时间(不是很长)。在外部范围声明temporary
,并且还调用malloc()
将一个字节放入其中,这只会令人困惑。