3

以下のコードスニペットを使用して、最小数のmalloc()呼び出しを使用して2D配列にメモリを割り当てています。

下付き文字p[i][j]を使用して配列にアクセスしたいと思います。

#define ROW 3
#define COL 2

int main()
{
    void **ptr = malloc( ROW*COL* sizeof(int) );

    int (*p)[COL] = ptr;

    int i, j;

    for( i = 0; i < ROW; ++i )
            for( j = 0; j < COL; ++j )
                    scanf("%d", &ptr[i][j]);

    for( i = 0; i < ROW; ++i )
    {
            for( j = 0; j < COL; ++j )
                    printf("%d ", p[i][j]);
            printf("\n");
    }

    return 0;
}

プログラムは、入力が何であれ、正しく出力しています。

ただし、 ランタイムエラーが表示されています 。なんで?

4

2 に答える 2

7

コンパイル時に配列の次元がわかっている場合(例のように)、実際に1回のmalloc呼び出しでメモリを割り当てることができます。ただし、そのメモリにアクセスするには、適切なポインタタイプを使用する必要があります。あなたの場合、それがあなたのp指針になります。あなたpのポインタは正しく宣言されていますが、何らかの理由であなたはその存在を完全に無視し、代わりにscanf使用しています。ptr

ptr配列アクセスに使用するのをやめます。を使用しpます。として配列要素にアクセスするp[i][j]と、機能するはずです。

ptr実際、私は完全に取り除き、次の方法でメモリ割り当てを行います

int (*p)[COL] = malloc(ROW * sizeof *p);

さらに、コンパイル時に両方のディメンションがわかっているため、実際には次のように割り当てることができます。

int (*p)[ROW][COL] = malloc(sizeof *p);

ただし、この場合は、として配列にアクセスすることを忘れないでください(*p)[i][j](に注意してください*)。お好みの方法を選択してください。

于 2012-08-26T21:02:46.383 に答える
0

これを試してください:

#define ROW 3
#define COL 2

int main()
{
    int *ptr = (int*)malloc( ROW*COL* sizeof(int) );

    int *p[COL];
    int i, j;

    fot (i = 0; i < COL; i++)
        p[i] = ptr + ROW * i;

    for( i = 0; i < ROW; ++i )
        for( j = 0; j < COL; ++j )
            scanf("%d", &p[i][j]);

    for( i = 0; i < ROW; ++i )
    {
            for( j = 0; j < COL; ++j )
                    printf("%d ", p[i][j]);
            printf("\n");
    }

    free(ptr);
    return 0;
}
于 2012-08-26T21:10:05.100 に答える