ディスカッション (6件)
C言語における配列の扱いは、多くのプログラマーが一度は躓く「沼」のようなポイントです。特にポインタとの境界線が曖昧で、直感に反する挙動を示すことも少なくありません。なぜCの配列は他の現代的な言語とこれほどまでに異なるのか、その背景にあるメモリ構造や仕様の闇を分かりやすく解説します。
実際問題、[static n]という表記を使えば有益な警告や境界チェックができるよ。 https://godbolt.org/z/PzcjW4zKK (https://godbolt.org/z/PzcjW4zKK) それから、(*array_ptr)[3]という表記は慣れるまで少し時間がかかるけど、非常に論理的だね。配列へのポインタがある場合、最初にデリファレンスしてからインデックスでアクセスするだけ。これも境界チェックに役立つよ: https://godbolt.org/z/ao1so9KP7 (https://godbolt.org/z/ao1so9KP7)
C言語には配列型なんて存在しないぞ。
Walter Brightを呼ぼう
これは歴史的な経緯で残っている、不適切な抽象化の典型例だと思う。RustからCを呼び出すためにFFIを使うときは、生成されたAPI(ポインタベースのもの)をRustの&[]配列構文でラップするようにしてる。C以外のほとんどの言語における配列、リスト、Vecなどは「アイテムの集合に対する抽象化」として機能しているけど、Cがポインタを直接露出させているのは、低レイヤーのメモリ操作やMMIO操作をビジネスロジックに無理やりねじ込んでいるように感じる。概念的には分けておきたいんだ。ポインタはドライバを書いたり、レジスタにアクセスしたり、フラッシュメモリに書き込んだりするため。配列やリスト、Vecはコレクションに対する高レベルな操作のため、という風にね。余談だけど、Zigの存在意義の一部は、Cのポインタベースのデータ構造やそれに伴うパターンを許容しつつ、Cの問題を修正することにあるんじゃないかって思ってる。
なんで2026年にもなってまだCの話をしてるんだ?HP-UXでも使ってるなら別だけど、わざわざ自分を縛り付けるようなことして何が楽しいの?