【发布时间】: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),这将截断为char值0xFF,它有效地打印出与空格相同的内容在输出行的末尾。您不会看到它,但如果您将输出保存到文件或使用十六进制编辑器或类似工具查看它,您会想知道它是从哪里来的。
标签: c loops pointers dynamic-memory-allocation realloc