配列のサイズとsizeof、配列の範囲外への参照
追記2:この記事は間違っている。サイズが0の配列はISO Cでは禁止されているので心配する必要はない。
追記:管理人の独り言(プログラミング関連) - 黒歴史集積所によると、この情報は怪しい。
C言語で配列の要素数を求める方法と、微妙な落とし穴について。
int foo[] = {4, 3, 2, 1}; unsigned int foo_len = (sizeof foo) / (sizeof foo[0]);
sizeof演算子を使って、配列のバイト数を要素のbyte数で割る方法。
C言語の配列は全て同じ型の物しか入れられないので、最初の項のbyte数をsizeofで求めれば良い。
#define LEN(array) (sizeof(array) / sizeof(array[0]))
とすることもある。
この方法は、
int foo[0]; LEN(foo);
とした時に未定義になる発見しずらいバグの原因となる。
要素数が0の配列を使うことは普通はないが、プログラムがソースコードを自動生成する場合などに起こるかもしれない。
Twitter / cxx: @javascripter gcc/g++で -によると、gccで-pedanticオプションを付けるとこのエラーを検出できるようだ。