C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー 配列の境界外アクセス

🗃️ 配列

配列の境界外アクセス

どんなときに起きるか

たいてい何事もなく動きます。ときどき無関係な変数の値が勝手に変わり、たまに Segmentation fault (core dumped)。-fsanitize=address を付けると ERROR: AddressSanitizer: stack-buffer-overflow。定数の添字なら gcc: warning: array subscript 10 is above array bounds of 'int[10]' [-Warray-bounds]。

なぜそうなるのか

Cは実行時に添字を検査しません。int a[10] の有効な添字は 0〜9 で、a[10] はもう他人の土地です。読むだけならゴミが返り、書き込むと黙って他のデータを壊します。

直し方・再発防止

ループは for (int i = 0; i < n; i++) と < を鉄則にします(<= は境界外の代表的な原因です)。要素数は sizeof a / sizeof a[0] で求めます(配列が配列のままの場所でのみ有効)。開発中は -fsanitize=address を付けて実行し、事故を早期に表面化させます。

0号室から始まります(4コマ漫画)
4コマで見る「0号室から始まります」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

関数に配列を渡すと sizeof が変わるmain では sizeof(a) が 40 なのに、同じ配列を渡した関数の中では 8(32bit環境なら4)に…

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH