我很想知道为什么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);
}
答案 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
指向的错误内存。