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」などから)。もちろん、最後の動作には割り当てテストは含まれていませんが、私が言っていることはわかりました。

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

ああ、私はほとんどそれを忘れていました:おそらくお気づきかもしれませんが、プログラムはCです。

4

1 に答える 1

3

これは、 の範囲外に書いている場合に発生する可能性がありますv_ReadALineOfTheWorld。一部のmallocライブラリは、mallocd 領域に関する情報を領域のラッパーに保存します。その情報freeが破損すると、クラッシュする可能性があります。

于 2012-04-17T05:01:08.573 に答える