C言語中級 ポインタとメモリ

完成と次のステップ

46 レッスンで手に入れたもの

おつかれさまでした。第1章では p + 1 が何バイト進むのかを確かめるところから始まり、いまは名前の長さぶんだけメモリを借り、ノードをつないで並べ、終了時に借りたものを全部返す成績管理CLI が動いています。通ってきたものを並べると、ポインタ演算、配列とポインタの同一性、スタックとヒープ、mallocfreecallocrealloc、文字列関数の自作、バッファの境界、構造体ポインタとアロー演算子、関数ポインタ、qsort、連結リスト、二次元の動的確保、コマンドライン引数、バイナリ入出力、errno です。C の難所と呼ばれる部分は、これでひととおり越えました。

配列版とリスト版を両方書いた意味

このコースの本当の成果物は、動くプログラムそのものではありません。同じアプリを 2 つの方式で書いた経験 のほうです。

入門の配列版は、人数の上限が最初に決まっていて、メモリのことを考える必要がありませんでした。中級のリスト版は上限が消えた代わりに、確保と解放の責任がこちらに移りました。どちらが優れているという話ではなく、何を諦めて何を得たか がはっきり見えたことが大事です。データ構造を選ぶという仕事は、これから先ずっと同じ形で出てきます。挿入が多いのか検索が多いのか、上限が読めるのか読めないのか、その判断材料をもう自分の手で確かめています。

メモリの感覚は他の言語でも消えない

Python も JavaScript も Java も、free を書かせません。ガベージコレクタが回収してくれるからです。それでも、変数が値そのものを持っているのか番地を持っているのかという区別は残ります。オブジェクトを関数に渡したら呼び出し元も変わるのはなぜか、リストのコピーが浅いとはどういうことか、こうした話はすべてポインタの話と同じ形をしています。C を通した人が他の言語で強いのは、この部分を図で説明できるからです。

次にどこへ進むか

進む先はおおよそ 3 つに分かれます。ひとつは データ構造とアルゴリズム です。連結リストの次はスタック、キュー、木構造、ハッシュ表と続きます。ノードをつなぐ操作はもう書けるので、入口は越えています。基本情報技術者試験の科目B にもリストや木の問題が出るので、資格の対策とそのまま重なります。

ふたつめは セキュリティ です。第3章で見たバッファオーバーフローは、実際の攻撃手法の土台になっている話でした。なぜ境界を越えると他人のデータを書き換えられるのかを、メモリの配置から説明できる状態になっています。

みっつめは 組込みやシステムプログラミング です。C が今も使われているのはこの領域で、メモリの量が限られていて、動的確保を避ける設計が求められる世界です。確保と解放の責任を自分で持つ感覚は、そのまま実務の入口になります。どれを選んでも、今日完成させたリスト版成績管理が土台になります。

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部