2026-09-12
print_all.c
#include <stdio.h>
void print_all(const int *arr, int n) {
for (int i = 0; i <= n; i++) {
printf("%d\n", arr[i]);
}
}
int main(void) {
int values[4] = {1, 2, 3, 4};
print_all(values, 4);
return 0;
}
print_all(values, 4)は配列valuesの4要素をすべて表示するつもりのコードですが、範囲外アクセスの未定義動作を起こします。原因を特定し、最小限の変更で直してください。
Answer
原因はfor (int i = 0; i <= n; i++)です。有効な添字は0からn - 1(このコードでは0〜3)なのに、i <= nだとi == n(4)のときも本体が実行され、arr[4]という配列の外を読んでしまいます。修正は境界をi < nに変えるだけです。要素数を表すnと、最後の有効な添字n - 1を取り違えるのが、off-by-oneの典型的な発生源です。