Namaran

Code daily. Without assist.

2026-09-16

print_all.c

void print_all(int arr[]) {
    size_t n = sizeof(arr) / sizeof(arr[0]);
    for (size_t i = 0; i < n; i++)
        printf("%d\n", arr[i]);
}

int main(void) {
    int data[5] = {10, 20, 30, 40, 50};
    print_all(data);
}

dataの5要素を全て出力するつもりですが、実際には1020の2行しか出力されません。何が問題で、どう直せばよいでしょうか?

Answer

仮引数int arr[]は実際にはint *として扱われるので、関数の中のsizeof(arr)はポインタのバイト数(このターゲット環境では8)を返します。sizeof(arr[0])は要素の型intのバイト数(4)なので、nは本来の要素数5ではなく8 / 4 = 2になってしまいます。要素数は配列が本物の配列型のままである呼び出し側(main)でしか正しく求められないので、それを引数として明示的に渡します:

void print_all(int arr[], size_t n) {
    for (size_t i = 0; i < n; i++)
        printf("%d\n", arr[i]);
}

int main(void) {
    int data[5] = {10, 20, 30, 40, 50};
    print_all(data, sizeof(data) / sizeof(data[0]));
}