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

时间:2016-01-13 16:47:49

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

我很想知道为什么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);
}

2 个答案:

答案 0 :(得分:5)

在指针上调用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.

答案 1 :(得分:4)

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

realloc(_Buf,size);

使用:

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

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