2012-04-17 13 views
1

検索計画アルゴリズムを実装する本当に簡単なプログラムについて助けを求めます。まあ、私が持っている問題は少し奇妙です:関数内でローカルに宣言された文字の単純な配列のためのメモリを割り当てた後、私はこの配列を処理し、すべての期待された振る舞いを持ちます。関数が終了する前にfree()関数をこの配列に追加すると、プログラムは停止し、中断します。この問題に関する経験がある人(またはそうでない人)が私を助けることができたら、本当に感謝します。私は、関数の頭部、宣言を入れていない以前に割り当てられたメモリを解放した後にプログラムが中止される

char* v_AllTheWorld 
char* v_ReadALineOfTheWorld; 

v_AllTheWorld = malloc(COLUMNS * LINES * sizeof(char)); /*LINES and COLUMNS are defined constants*/ 

if(v_AllTheWorld == NULL) 
{ 
    fprintf(stderr, "..."); //etc, etc. 
    exit(1); 
} 

v_ReadALineOfTheWorld = malloc(COLUMNS * sizeof(char)); /*the "sizeof(char)" looks useless, but there's no point in talking about that here, i guess.*/ 

if(v_ReadALineOfTheWorld == NULL) 
{ 
    fprintf(stderr, "..."); //etc, etc. 
    exit(1); 
} 

while(/*some_condition (number of lines to be read)*/) 
{ 
    //read data string from stream and stores in v_ReadALineOfTheWorld (fscanf); 
    //appends the read data to v_AllTheWorld (strncat); 
} 

free(v_ReadALineOfTheWorld); 
/*The program is stopping right after this call in the debug.*/ 

return v_AllTheWorld; 

:さて、ここで私は(それが書かれているものを正確にはありませんが、話しているかを示すために、「シミュレート」のコードのいくつかの行を次のそのストリームを表現したり、データを細かく操作する方法はありませんでしたが、他の "malloc"や "free"の呼び出しは行われず、すべてのコードは無条件で実行されます(if "など)。最後の救いは、割り当てテストは含まれていませんが、私は何を言っているのですか?

ですから、私はこのように質問しました。問題は正しい方法で、私はあなたが私を助けてくれることを願っています。

ああ、私はほとんど忘れてしまったことを:あなたはおそらく気づいて、プログラムはあなたがv_ReadALineOfTheWorldの境界外書き込みをしている場合、これが発生する可能性がC.

+0

'while'ループの内容を確認できますか?私は 'free(v_ReadALineOfTheWorld) 'が未定義の動作を引き起こすポインタ' v_ReadALineOfTheWorld'をインクリメントしていると思います。解放しているポインタは、mallocから返されたものと同じでなければならないことに注意してください。 – Naveen

+1

GDBを使ってみて、メモリの場所を見ましたか? – noMAD

+0

また、 'calloc(v_ReadALineOfTheWorld、0)'を試してください。 – noMAD

答えて

3

です。 mallocライブラリの中には、malloc d地域に関する情報が地域のラッパーに格納されていて、その情報を破損した場合はfreeがクラッシュする可能性があります。

+0

さて、私はそれをチェックしようとします。ありがとうございました。 – user1337778

関連する問題