我很想知道为什么realloc()
不能在我的循环中工作。我做了一个grep
函数,我在一个大的文本文件上测试,突然程序崩溃告诉我“堆的腐败”所以我决定打破它在小范围内尝试,但问题仍然存在。有人可以解释什么是错的?为什么realloc在这个while循环中不起作用?
#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);' – Magix
@BLUEPIXY是不是像成功返回0? –
'_Buf [n ++] = c;'会将一个截断的'EOF'值作为字符串中的最后一个字符。假设'EOF'的'int'值为'-1',十六进制值为'0xFFFFFFFF'(32位'int'),它将截断为'char'值'0xFF',这将有效地打印为输出行末尾的空格。你不会看到它,但如果你保存你的输出到一个文件或用十六进制编辑器或类似的东西看它,你会想知道从哪里来。 –