2011-12-17 10 views
1

を見つけることができません。これは、プログラムでは、入力は、私たちがに1つの文字列をプッシュした後、LINEBUFに一つずつ文字列をプッシュし、その後、ファイルからいくつかの文字列です。 LineBufLineBufと入力し、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()を呼び出した後、LineBufをNULLに設定する必要があります。 – thumbmunkeys

+0

4時間はそれほどバグを見つけられません。いくつかのバグはあなたに4週間かかるでしょう!このために、「valgrind」があなたを助けてくれたでしょう。 –

+0

@ user1103180コード – Ankit

答えて

1

方法realloc (void * ptr, size_t size)作品: はブロックで使用可能なメモリ の量を拡大または縮小、sizeバイトに変更されたメモリブロックの

サイズはptrパラメータによって指されます。この関数は、新しい場所にメモリブロックを移動させる可能性があります。 新しい場所が返されます。 ptrNULLである場合には

は、関数が正確malloc、 としてsizeバイトの新しいブロックを割り当て、その 先頭へのポインタを返す振る舞います。プログラムがこのメモリブロックを移動しようとしたときにポインタがすでに解放され、まだNULLではありませんあなたのケースでは

は、そう、それはメモリ破損の原因となります。それを解決するために

、あなたは次のいずれかを実行する必要があります。

  • free()を削除します。
  • reallocの代わりにmallocを使用してください。
  • free()の後にLineBufをNULLに設定します。
1

これはLINEBUFを空にしていません。 LineBufのストレージスペースを解放します。後でLineBuffを再割り当てすると、解放されたスペースを再割り当てしようとします。

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

フリーループをwhileループから外して解決します。格納するデータのすべてをnullに設定して、空の空きバッファを空にします。

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

1

reallocfreeポインタです。あなたはそれをすることはできません!

0

free(LineBuf)はメモリを解放していますが、後でreallocを呼び出すときにLineBufを使用しています。解放後にLineBufをNULLに設定すると、reallocはmallocを行い、再割り当てしません。ポインターを解放した後にNULLに設定するのは、常に良い方法です。これは、解放されたメモリへのポインタを使用しているかどうかを検出するのに役立ちます。

ところで、あなたのコードを見て、あなたが何をしようとしているのかよく分かりません。あなたがやりたいことに応じて、LineBufやfgetsを取り除くかもしれません。また、私は毎回strlenを呼び出してもパフォーマンスはあまり良くないので、temp [i]!= '\ 0'を確認する方がよいでしょう。

+0

に関連する質問の見出しを使用してください。このプログラムはテスト用です。大きなプログラムを書くのですが、** PushToBuf **機能には、さまざまな種類の試行の後にいくつかの小さな問題があります。関数をコピーし、私のコードを修正するための小さなプログラムを書く。 – thlgood

関連する問題