0

重複の可能性:
最小数の malloc 呼び出しで 2D 配列にメモリを割り当てる

C void ポインターに関する私の知識では、適切なデータ型に自動的に変換されます。以下は、警告を見つけたプログラムです。

互換性のないポインター型からの初期化 [デフォルトで有効]

#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", &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;
}

しかし、それは完全に機能しました。void**ポインターが「COLサイズの整数配列へのポインター」にキャストされた型である場合、その動作は変更され、2D配列のように動作する必要がありますか?

4

2 に答える 2

2

まず、void **ポインターはポインターではありませんvoid *void **void *2 つの完全に異なるタイプです。に適用される変換プロパティが何であれ、に適用されvoid *ませんptr。コンパイラが警告メッセージで伝えたように、初期化は実際には無効です。

void **第二に、プログラムにポインターはまったく必要ありません。とにかくそれはどこから来たのですか?プログラムに「中間」ポインターが必要な場合は、型ptrで宣言する必要がありますvoid *

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

そして警告は消えます。ただし、以前の回答で述べたように、この場合、中間ポインターは実際には必要ありません。あなたはただすることができます

int (*p)[COL] = malloc(ROW * sizeof *p);
于 2012-08-27T06:01:37.160 に答える
0

ポインターへのポインターを任意のポインターに割り当てることができます。voidただし、ポインターを void ポインターに割り当てます。これは別のことです。

于 2012-08-27T05:58:48.937 に答える