Namaran

Code daily. Without assist.

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の典型的な発生源です。