Namara

毎日コード。手助けなし。

2026-08-20

decay.c

#include <stdio.h>

void describe(int arr[10]) {
    printf("%zu\n", sizeof(arr));
}

int main(void) {
    int nums[10] = {0};
    printf("%zu\n", sizeof(nums));
    describe(nums);
}

この2つの出力される値には、何か共通点があるでしょうか?それとも、ないでしょうか?

答え

異なります。mainの中ではnumsは実体を持つ配列なので、sizeof(nums)10 * sizeof(int)(通常は40)になります。しかし、int arr[10]と書かれた関数のパラメータは、コンパイラによって暗黙のうちにint *arrに読み替えられます — 関数に渡されるとき、配列はポインタに変換(decay)されるのです。そのためdescribeの中のsizeof(arr)は、40ではなく単なるsizeof(int*)(通常は8)になります。標準規格で定義された動作ですが、忘れやすい点です。