配列: 並んだメモリ
壁のないコインロッカー。範囲外アクセスは自己責任。
配列
同じ型のデータを連続して並べたもの。
添字 (Index)
配列の要素番号。0から始まる。
境界チェック
アクセスが配列の範囲内か確認すること。C言語はこれを自動でやってくれない。
区切られたコインロッカー
配列は、メモリ上に連続して確保された「コインロッカーの列」です。0
から始まる番号(添字)で管理されます。
他の高級言語(PythonやJava)と違い、C言語の配列には
「壁(境界チェック)」がありません。サイズ5の配列に対して a[100]
にアクセスしようとすると、エラーにならずに実行され、隣のメモリ(関係ないデータやプログラム自体)を書き換えてしまいます。これがセキュリティ脆弱性の原因トップランカー「バッファオーバーフロー」です。
配列の罠
やってはいけない2大アンチパターンです。
// ❌ バッファオーバーフローint a[5];// 有効なのは 0, 1, 2, 3, 4 だけa[5] = 100; // 範囲外アクセス!
// ❌ 戻り値として返すint* wrong_func() { int local[3] = {1, 2, 3}; return local; // 関数終了時に消滅する!}// コンパイル警告が出ますが、無視して実行するとクラッシュします。実践テクニック
要素数の計算
配列のサイズを自動計算するイディオムです。ループの上限などで使います。
// 配列の要素数を計算するイディオム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してはいけない理由を知っている