【问题标题】:Proper way to realloc in c在c中重新分配的正确方法
【发布时间】:2017-08-03 00:49:09
【问题描述】:

我有以下代码:

FILE *fp;
fp = fopen("input_file","r");
size_t newsize = 1;
char buffer[MAX_SIZE];
char *text;
text = malloc(sizeof(char) * newsize);
strcpy(text,"");

while (fgets(buffer,sizeof(buffer),fp) != NULL)
{
    newsize += strlen(buffer)
    text = realloc(text,newsize);
    strcat(text,buffer);
}

在我的程序的最后,我free(text)。每次重新分配后我需要释放吗?现在我的程序“工作”,但是当我通过 valgrind 运行它时,我得到了很多错误。

编辑:我编辑了所有其他代码,这是我在 realloc 部分之前得到的错误

==3953== Warning: client switching stacks?  SP change: 0x7ff0004c0 --> 0x7fe85f190
==3953==          to suppress, use: --max-stackframe=8000304 or greater
==3953== Invalid write of size 4
==3953==    at 0x40076E: main (p21.c:37)
==3953==  Address 0x7fe85f19c is on thread 1's stack
==3953==
==3953== Invalid write of size 8
==3953==    at 0x400774: main (p21.c:37)
==3953==  Address 0x7fe85f190 is on thread 1's stack
==3953==
==3953== Invalid write of size 8
==3953==    at 0x400793: main (p21.c:43)
==3953==  Address 0x7fe85f188 is on thread 1's stack
==3953==
==3953== Invalid read of size 8
==3953==    at 0x4E8C38D: __fopen_maybe_mmap (iofopen.c:60)
==3953==    by 0x400797: main (p21.c:43)
==3953==  Address 0x7fe85f188 is on thread 1's stack
==3953==
==3953== Warning: client switching stacks?  SP change: 0x7fe85f190 --> 0x7ff0004c0
==3953==          to suppress, use: --max-stackframe=8000304 or greater

【问题讨论】:

  • "但是当我通过 valgrind 运行它时,我得到了很多错误" - 请在此处复制粘贴错误。
  • 发布了错误@CoolGuy。在初始化部分它给了我错误,但我不知道为什么
  • 我想我明白了。当我让 char[buffer] 太大时,它会给我这些错误。我可以存储到缓冲区的最大大小是多少?我之前用过400万,没用。 100 万人在工作
  • 这不是为整个文件分配内存的好方法。最好找到文件的大小(stat()fstat()ftell() 等)并分配所需的空间并一次读取整个文件。实际上,您最终会得到二次行为,因为 strcat() 在每次添加新行的数据之前都会不断重新遍历相同的数据。
  • @PaperCode46 不要像这样将 1 MB 或更大的数组扔到堆栈中。堆栈的大小通常很小,从 1 到 8 MB。因此,将MAX_SIZE 的大小减小到较小的值,比如1000。但是为什么将数据读入堆栈分配的数组然后将其复制到堆中而不是直接将其读入堆中是没有意义的。分配一小块内存,读入它,再分配一点,读取等等,直到没有更多的数据。然后realloc所需的内存量

标签: c dynamic malloc realloc


【解决方案1】:

每次重新分配后我需要释放吗?

没有。 realloc 释放旧的内存块并给你一个新的内存块来玩。

除非它可以扩展内存块而不释放它,在这种情况下它会这样做并返回相同的块。但同样在这种情况下,由于没有分配任何额外内容,因此没有任何额外内容可释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2014-12-01
    • 2020-07-07
    • 2011-06-02
    • 2013-11-30
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多