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要素を全て出力するつもりですが、実際には10と20の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]));
}