配列: 並んだメモリ

壁のないコインロッカー。範囲外アクセスは自己責任。

配列
同じ型のデータを連続して並べたもの。
添字 (Index)
配列の要素番号。0から始まる。
境界チェック
アクセスが配列の範囲内か確認すること。C言語はこれを自動でやってくれない。
コインロッカー (Coin Lockers)

配列は「連番のコインロッカー」です。 ロッカー番号(添字)は 0 から始まります(0, 1, 2...)。 C言語のロッカーには恐ろしい特徴があります。それは「仕切りがない」ことです。5個しか借りていないのに「6番目のロッカー」を開けようとすると、怒られずに「隣の人のロッカー(関係ないメモリ)」を平気で開けてしまいます。これがバグの温床です。

区切られたコインロッカー

配列は、メモリ上に連続して確保された「コインロッカーの列」です。0 から始まる番号(添字)で管理されます。

他の高級言語(PythonやJava)と違い、C言語の配列には 「壁(境界チェック)」がありません。サイズ5の配列に対して a[100] にアクセスしようとすると、エラーにならずに実行され、隣のメモリ(関係ないデータやプログラム自体)を書き換えてしまいます。これがセキュリティ脆弱性の原因トップランカー「バッファオーバーフロー」です。

配列の罠

やってはいけない2大アンチパターンです。

Do NOT do this
// ❌ バッファオーバーフロー
int a[5];
// 有効なのは 0, 1, 2, 3, 4 だけ
a[5] = 100; // 範囲外アクセス!
// ❌ 戻り値として返す
int* wrong_func() {
int local[3] = {1, 2, 3};
return local; // 関数終了時に消滅する!
}
// コンパイル警告が出ますが、無視して実行するとクラッシュします。

実践テクニック

要素数の計算

配列のサイズを自動計算するイディオムです。ループの上限などで使います。

sizeof Idiom
// 配列の要素数を計算するイディオム
int arr[] = {10, 20, 30, 40, 50, 60};
// 全体サイズ ÷ 1個分のサイズ = 個数
int count = sizeof(arr) / sizeof(arr[0]);
// 24 bytes / 4 bytes = 6

演習課題

課題1: 合計と平均
サイズ5の整数配列に好きな値を入れ、その合計と平均を計算して表示してください。

合格ライン

配列の添字が0から始まることを忘れない
範囲外アクセスの危険性を説明できる
ローカル配列をreturnしてはいけない理由を知っている