0

次のコードを使用して割り当てられた 2 番目の配列の割り当てを解除しようとしています。

int** createMatrix(int k)
{
    int i;
    int **res;

    res = (int**)malloc(sizeof(int*)*k);
    checkalloc(res);

    for (i = 0; i < k; i++)
    {
        res[i] = (int*)malloc(sizeof(int)*k);
        checkalloc(res[i]);
    }
    return res;
}

以下の機能で

void freeMatrix(int ***matrix, int k)
{
    int i;

    for (i = 0; i < k; i++)
        free(matrix[i]);

    free(matrix);
}

最初の要素は適切に割り当て解除されていますがi=1、関数がエラーでクラッシュすると:

First-chance exception at 0x0f7e7e2c (msvcr100d.dll) in Q2.exe: 0xC0000005: Access violation reading location 0xccccccc8.
Unhandled exception at 0x0f7e7e2c (msvcr100d.dll) in Q2.exe: 0xC0000005: Access violation reading location 0xccccccc8.

私は何を間違っていますか?

編集:

以下によって割り当てられた同様の配列の割り当てを解除しようとすると、同じことが起こります。

CHARS** createImageMatrix(FILE *fp, int rows, int cols, int format)
{
    CHARS**res;
    int i;

    res = (CHARS**)malloc(sizeof(CHARS*)*rows);
    checkalloc(res);

    for (i = 0; i < height; i++)
    {
        res[i] = (CHARS*)malloc(sizeof(CHARS)*cols);
        checkalloc(res[i]);
    }
    return res;
}

および割り当て解除:

void freeCharsMatrix(CHARS **matrix, int rows)
{
    int i;
    for (i = 0; i < rows; i++)
        free(matrix[i]);
    free(matrix);
}

CHARS が次の場合:

typedef struct Chars {
char A;
char B;
char C;
char D;

} CHARS;

しかし、今回は次のようになります。

エラー

私がどうかしましたか、まずいことでもありましたか?

4

2 に答える 2

4
void freeMatrix(int ***matrix, int k)

==>

void freeMatrix(int **matrix, int k)

編集:

free(matrix+i) // when you do this the pointer across the whole array . 

==>

free(matrix[i])
于 2013-08-21T21:25:18.240 に答える