C言語 配列オーバーの動き

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

プロがおっしゃるに、C言語では以下のような事象があるとのこと。

  • C言語のプログラムのバグの半分以上は配列の添え字が大きいことに起因する
#include <stdio.h>

main () {
        int days[12] =
                {
                31,28,31,30,31,30,
                31,31,30,31,30,31
                } ;

        int i;
        for (i = 1; i <= 12; i++) {
                printf("%d月は、%d日まであります。\n", i, days[i-1]);
        }
}

上記ではdays[12]を定義しているが、成分名はdays[0], days[1], …のように0から開始する。当然days[12]はない。days[12]にアクセスしようとすると(これを著者は"配列オーバー"という)、どうなるかは「わからない」とのこと。これは、C言語が配列オーバーのときにどのような動作をするかを、規定していないからだそう。固まって動かなくなることもあるらしい。

(恐ろしいのでメモ…)