-1

この関数を使用して 2 次元配列を割り当てた後:

char** make_matrix(int M, int N)
{
    char** MAT = (char**)malloc(M * sizeof(char));
    for (int i = 0; i < M; i++)
    {
        MAT[i] = (char*)malloc(N * sizeof(char));
    }
    return MAT;
}

しようとするfree(M[0])と、アサーションの失敗が発生することがわかりました。2次元配列の解放に関連して見つけることができるすべては、int代わりにchar. charただし、すべてを上記に置き換えるintと、アサーションの失敗はなくなります。これはなぜですか?どうすれば 2 次元配列全体を解放できますか?

4

4 に答える 4

8

に割り当てるメモリが少なすぎますMAT。関連する行を次のように変更します。

char** MAT = (char**)malloc(M * sizeof(char*));

これは、MAT が文字ではなくポインターの配列であるためです。コードが十分なメモリを割り当てていないため、配列の範囲外に書き込み、メモリを破損していた可能性があります。

整数の方が大きいため、整数でも機能する可能性があるため、運が良ければ、十分なメモリを割り当てることができた可能性があります (少なくとも 32 ビット マシンでは)。

于 2013-01-22T02:44:42.717 に答える
1

最初の malloc 呼び出しは、sizeof(char *) ではなく M * sizeof(char) です。sizeof(char) は 1 バイトで、char* のサイズはおそらく 4 バイトです。

編集:誰かが私を打ちのめしたのを見ました。他の人の答えを受け入れます。

于 2013-01-22T02:45:34.973 に答える
0

行列のすべての行を反復処理して最初に解放し、最後に MAT を解放する必要があります。

このようなもの:

void free_matrix(int M)
{
    for (in i = 0; i < M; i++)
    {
        free(MAT[i]);
    }
    free(MAT);
}
于 2013-01-22T02:46:38.547 に答える
0

スペースを解放するには (正しく割り当てられていると仮定)、へのfree()各呼び出しに対応する への呼び出しが必要malloc()です。

void destroy_matrix(char **MAT, int M)
{
    for (int i = 0; i < M; i++)
        free(MAT[i]);
    free(MAT);
}

あなたのコードは、(32ビット)システムでbecauseに置き換えるcharと機能します。それは主に偶然によるものです。64 ビット システムでは、再び問題が発生します。intsizeof(int) == sizeof(int *)

于 2013-01-22T02:49:43.273 に答える