【问题标题】:Why realloc doesn't work in this while loop?为什么 realloc 在这个 while 循环中不起作用?
【发布时间】:2016-04-18 18:17:29
【问题描述】:

我很想知道为什么realloc() 在我的循环中不起作用。我创建了一个grep 函数,我在一个大文本文件上进行了测试,突然程序崩溃告诉我“堆损坏" 所以我决定拆分它并在较小的范围内尝试它,但问题仍然存在。有人可以解释什么问题吗?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void grep(const char *Pattern,FILE *file);

int main(void)
{
    FILE *file;
    if(fopen_s(&file,"file.txt","r"))
        return 1;
    grep("word",file);
    fclose(file);
    return 0;
}

void grep(const char *Pattern,FILE *file)
{
    size_t size = 5*sizeof(char);
    char *_Buf = (char*)malloc(size);
    int n = 0, c;
    while(c=getc(file))
    {
        _Buf[n++] = c;
        if(c == '\n' || c == EOF)
        {
            _Buf[n] = '\0';
            if(strstr(_Buf,Pattern))
                printf("%s",_Buf);
            if(c == EOF)
                break;
            n = 0;
        }
        if(n == size)
        {
            size += 5;
            realloc(_Buf,size);
        }
    }
    free(_Buf);
}

【问题讨论】:

  • 你必须使用_Buf = realloc(_Buf, size);
  • @BLUEPIXY 是不是就像成功返回 0 一样?
  • _Buf[n++] = c; 会将截断的EOF 值作为字符串中的最后一个字符。假设EOF 具有int-1 和十六进制值0xFFFFFFFF(32 位int),这将截断为char0xFF,它有效地打印出与空格相同的内容在输出行的末尾。您不会看到它,但如果您将输出保存到文件或使用十六进制编辑器或类似工具查看它,您会想知道它是从哪里来的。

标签: c loops pointers dynamic-memory-allocation realloc


【解决方案1】:

在指针上调用realloc() 不会调整旧指针。它释放旧指针并返回一个包含新分配的新指针。之后需要使用返回的指针。

来自C11 标准,第 7.22.3.5 章,realloc 函数

void *realloc(void *ptr, size_t size);

realloc 函数释放 ptr 指向的旧对象并返回一个 指向具有size 指定大小的新对象的指针。 [...]

因此,您需要收集返回的指针,检查 NULL 并将其分配回之前的指针。

也就是说,please see this discussion on why not to cast the return value of malloc() and family in C.

【讨论】:

  • 谢谢你的回答。我的错误是完全错误的。至于没有投射malloc的结果我知道,我已经在SO上看到过百万次了,但是我使用的是c++编译器,所以这就是我投的原因:)
  • @machine_1 不客气。只是说,坚持使用 C 编译器来编译 C 代码。
【解决方案2】:

您没有将返回的 realloc() 指针分配给变量/指针:

realloc(_Buf,size);

用途:

char * _New_Buf = realloc(_Buf,size);
if(_New_Buf != NULL)
    _Buf = _NewBuf;
else
    ; // add some error handling here

否则,free() 也将释放由可能无效的_Buf 指向的错误内存。

猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2016-07-23
  • 2023-02-11
  • 1970-01-01
相关资源
最近更新 更多