2011-12-17 64 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

相關問題