bugfix> c > 投稿

私の友人と私はこれについて議論しています。

char **array[2][2];

これがメモリ 8 + 2*2*8 で占めるサイズです—ポインターの配列へのポインターの場合は8、次にポインターの配列の場合は32 または、ポインターの配列へのポインターを宣言しているため、8だけです。この宣言では、ポインターの配列にスペースを割り当てる必要はなく、ポインターだけを割り当てますか?

回答 2 件
  • コンパイラーは配列全体(32バイト)を割り当てます。 sizeof()でこれらの質問を調査できます:

    #include <stdio.h>
    char ** array[2][2];
    int main() {
        printf("size = %zu\n", sizeof(array));
        printf("size[0] = %zu\n", sizeof(array[0]));
        printf("size[0][0] = %zu\n", sizeof(array[0][0]));
        return 0;
    }
    
    

    x86_64アーキテクチャでは以下を返します。

    size = 32
    size[0] = 16
    size[0][0] = 8
    
    

    各ポインターの長さは8バイトで、2次元配列には合計4バイトが含まれます。

  • cdeclが(少しいじって)言ったかもしれないので、あなたの宣言

    
    char ** array[2][2];
    
    

    array を宣言します   char へのポインターへの2つのポインターの2つの配列の配列として 。これは、合計4つの char ** 型の要素を意味します  (何もありません)。 Cは、ポインターの大きさを指定したり、異なるタイプへのポインターが同じサイズであることも指定していませんが、すべてのポインターが8バイト幅である64ビット実装では一般的です。このような実装では、宣言されたオブジェクトのサイズは2 * 2 * 8 == 32バイトです。余分なポインターはありません。

    char * の2 x 2配列へのポインターが必要な場合 、それは異なります:

    char * (*array)[2][2];
    
    

    ...そして、そのサイズは確かに1つのポインターのサイズです。その場合、ポイント先の2Dアレイ用のストレージは予約されていません。

あなたの答え