昨日、C で 2 次元配列を動的に割り当てたいという SOに関する質問に出くわしました。
答えの 1 つは、次のように割り当てることでした。
int (*place)[columns] = malloc(rows * sizeof *place);
これは美しいこととは別に、私の頭に疑問を投げかけました。質問は次のとおりです。
以下は、4x4を割り当てるコードです
int (*arr)[4] = (int (*)[4]) malloc(4 * sizeof *arr);
printf("%d\n", sizeof arr); //Dynamic 2-D array by above method
int **arr1 = (int**) malloc(4 * sizeof(int*));
for(int i = 0; i < 4; i++)
arr1[i] = (int *) malloc(sizeof(double));
printf("%d\n", sizeof arr1); //Usual dynamic 2-D array
int *arr2 = (int*) malloc(4 * sizeof(int));
printf("%d\n", sizeof arr2); //Dynamic 1-D array
通常の出力は次のとおりです。
4
4
4
sizeof *arr
ただし、 、sizeof *arr1
およびを印刷しようとするとsizeof *arr2
、出力は次のようになります。
16
4
4
なぜこれが起こっているのかわかりません。の出力が である理由sizeof *arr
は16
何ですか? 最初のケースでメモリはどのように割り当てられていますか?
また、 と のアドレスを印刷しようとするarr
と*arr
、両方の印刷値が同じになります。*arr
は「での値」を意味しますarr
。つまり、 arr は独自のアドレスを格納する、つまり、それ自体を指しているということですか (これは可能ではないと思います)。少し混乱しています。どこが間違っているのでしょうか?
ご協力いただきありがとうございます!