gpt4 book ai didi

c - 内存分配问题

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

#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)我在哪里写了“这里”。

如果您想指出我的代码中的另一个问题,我很高兴学到一些东西。

最佳答案

当此代码执行该行时

buffer = temporary;

发生了两件事。一、内存buffer所持被“泄露”;您不再有该地址可以传递给 free() 。二、buffertemporary现在两者都指向由 malloc() 分配的一 block 内存或通过 realloc() 。因此,当您调用free()时在 buffer 上或temporary ,你已经释放了那 block 内存;调用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将保持有用的值(value)(不会很长)。声明temporary在外部范围,并且还调用 malloc()将一个字节放入其中,只是令人困惑。

关于c - 内存分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942463/

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