検索計画アルゴリズムを実装する本当に簡単なプログラムについて助けを求めます。まあ、私が持っている問題は少し奇妙です:関数内でローカルに宣言された文字の単純な配列のためのメモリを割り当てた後、私はこの配列を処理し、すべての期待された振る舞いを持ちます。関数が終了する前に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.
'while'ループの内容を確認できますか?私は 'free(v_ReadALineOfTheWorld) 'が未定義の動作を引き起こすポインタ' v_ReadALineOfTheWorld'をインクリメントしていると思います。解放しているポインタは、mallocから返されたものと同じでなければならないことに注意してください。 – Naveen
GDBを使ってみて、メモリの場所を見ましたか? – noMAD
また、 'calloc(v_ReadALineOfTheWorld、0)'を試してください。 – noMAD