2011-12-17 75 views
1

这是程序输入从文件中一些字符串,然后推入串入LineBuf一个接一个,在我们推一个字符串转换成LineBuf,print LineBuf,然后,制作LineBuf为空。我调试它4小时,但我仍然无法找到BUG

这是我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *LineBuf = NULL; 
int BufLen = 0; 

void PushToBuf(char c) 
{ 
    LineBuf = (char *)realloc(LineBuf, (BufLen+2)*sizeof(char)); 
    LineBuf[BufLen] = c; 
    BufLen++; 
    LineBuf[BufLen] = '\0'; 
} 

int main() 
{ 
    char temp[20]; 
    int i; 
    FILE *fp; 
    fp = fopen("input", "r"); 

    while (fgets(temp, 20, fp) > 0) 
    { 
     /*Push temp into buf*/ 
     for (i = 0; i < strlen(temp); i++) 
      PushToBuf(temp[i]); 

     /*print buf*/ 
     printf("%s\n", LineBuf); 
     printf("%d\n", BufLen); 

     /*make buf empty*/ 
     free(LineBuf); 
     BufLen = 0; 
    } 
    return 0; 
} 

这是我的输入流:

This is a test. Good evening 
bye~ 

这是运行结果:

This is a test file 
19 
. Good evening 

15 
glibc detected ./a.out: double free or corruption (fasttop): 0x00000000023fa250 

======= Backtrace: ========= 

/lib/libc.so.6(+0x775b6)[0x7f2ad01bf5b6] 
/lib/libc.so.6(cfree+0x73)[0x7f2ad01c5e83] 
./a.out[0x400868] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f2ad0166c4d] 
./a.out[0x400699] 
+3

调用free() – thumbmunkeys 2011-12-17 14:45:28

+0

后,您应该将LineBuf设置为NULL 4小时对于查找错误没有多大意义;一些错误会带你4周!对于这个,'valgrind'会帮助你。 – 2011-12-17 15:12:05

+0

@ user1103180请使用与代码 – Ankit 2011-12-17 15:16:45

回答

1

如何realloc (void * ptr, size_t size)作品:

存储器块的大小由ptr参数指向的 改变为size字节,扩大或缩小的存储器 在块中可用的量。该功能可能会将内存块移至新位置,其中 将返回新位置。

在这ptrNULL情况下,函数的行为完全如malloc, 分配的size字节的新块和返回指针到 开始它。

在你的情况下,指针已经释放,但仍然不是NULL,所以当程序试图移动这个内存块时,它会导致内存损坏。

为了解决这个问题,你应该做下列之一:

  • 删除free()。使用malloc代替realloc
  • LineBuf设置为free()后的NULL。
1

这没有LineBuf空。它释放LineBuf的存储空间。当您稍后重新分配LineBuff时,它尝试重新分配已释放的空间。

/*make buf empty*/ 
    free(LineBuf); 

解决provlem将免费移出while循环。并将空闲缓冲区设置为空,将所有存储的数据设置为空。

for(int i = 0; i < BuffLen) LineBuf [i] ='\ 0';

1

您正在尝试realloc a free'd指针;你不能这样做!

0

free(LineBuf)释放内存,但您在调用realloc时再次使用LineBuf。释放它之后,你应该将LineBuf设置为NULL,然后realloc将执行malloc,而不是重新分配。请记住,释放它们之后将指针设置为NULL总是一个好习惯。这有助于检测您是否使用指向释放内存的指针。

顺便说一句,看着你的代码我不太清楚你打算做什么。根据你想要做什么,你可能会摆脱LineBuf或fgets。另外:为每个我调用strlen不是很高效,你最好检查temp [i]!='\ 0'。

+0

更多相关的问题标题,这个程序仅用于测试〜。我写了一个更大的程序,但是我发现** PushToBuf **函数有一些小问题,经过各种尝试后,我复制函数并编写一个小程序来修复我的代码。 – thlgood 2011-12-17 16:10:40

相关问题