読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

配列のサイズとsizeof、配列の範囲外への参照

c

追記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オプションを付けるとこのエラーを検出できるようだ。