为什么 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
.。
我很想知道为什么 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 byptr
and returns a pointer to a new object that has the size specified bysize
. [...]
因此,您需要收集返回的指针,检查是否为 NULL 并将其分配回之前的指针。
也就是说,please see this discussion on why not to cast the return value of malloc()
and family in C
.。