为什么 realloc 在此 while 循环中不起作用?

Why realloc doesn't work in this while loop?

我很想知道为什么 realloc() 在我的 loop.I 中不起作用,我在一个大文本文件上测试了一个 grep 函数,突然程序崩溃告诉我"corruption of the heap" 所以我决定把它分解并在较小的规模上尝试,但是问题 persist.Can 有人解释一下哪里错了吗?

#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] = '[=10=]';
            if(strstr(_Buf,Pattern))
                printf("%s",_Buf);
            if(c == EOF)
                break;
            n = 0;
        }
        if(n == size)
        {
            size += 5;
            realloc(_Buf,size);
        }
    }
    free(_Buf);
}

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

realloc(_Buf,size);

使用:

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

否则,free()也会free-ing指向一个可能无效的内存_Buf

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

来自 C11 标准,章节 §7.22.3.5,realloc 函数

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

The realloc function deallocates the old object pointed to by ptr and returns a pointer to a new object that has the size specified by size. [...]

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

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