Namaran

Code daily. Without assist.

2026-08-27

fill_array.c

#include <stdio.h>

int main(void) {
    int a[3];
    int i = 0;

    while (i < 3) {
        a[i] = i++;
    }

    for (int j = 0; j < 3; j++) {
        printf("%d ", a[j]);
    }
    printf("\n");
}

このループはa{0, 1, 2}にするつもりですが、a[i] = i++;は未定義動作(undefined behavior)です。何が問題で、どう直せばよいでしょうか?

Answer

a[i] = i++;は、左辺で添字としてiを読み取りながら、右辺の後置インクリメントが同じiを書き換えるという副作用を、同じ式の中で起こしています。この2つの間には副作用完了規則(sequence point)がないため、aのどの要素に書き込まれるかはコンパイラ次第で変わり得ます。最小限の修正は、読み取りとインクリメントの副作用を別の文に分けることです:

while (i < 3) {
    a[i] = i;
    i++;
}