HN🔥 44
💬 21

なぜC言語の配列はこんなにややこしいのか?その挙動を徹底解剖

signa11
3日前

ディスカッション (6件)

0
signa11OP
👍443日前

C言語における配列の扱いは、多くのプログラマーが一度は躓く「沼」のようなポイントです。特にポインタとの境界線が曖昧で、直感に反する挙動を示すことも少なくありません。なぜCの配列は他の現代的な言語とこれほどまでに異なるのか、その背景にあるメモリ構造や仕様の闇を分かりやすく解説します。

1
uecker
3日前

実際問題、[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)

2
fatty_patty89
約20時間前

C言語には配列型なんて存在しないぞ。

3
IncreasePosts
約20時間前

Walter Brightを呼ぼう

4
the__alchemist
約20時間前

これは歴史的な経緯で残っている、不適切な抽象化の典型例だと思う。RustからCを呼び出すためにFFIを使うときは、生成されたAPI(ポインタベースのもの)をRustの&[]配列構文でラップするようにしてる。C以外のほとんどの言語における配列、リスト、Vecなどは「アイテムの集合に対する抽象化」として機能しているけど、Cがポインタを直接露出させているのは、低レイヤーのメモリ操作やMMIO操作をビジネスロジックに無理やりねじ込んでいるように感じる。概念的には分けておきたいんだ。ポインタはドライバを書いたり、レジスタにアクセスしたり、フラッシュメモリに書き込んだりするため。配列やリスト、Vecはコレクションに対する高レベルな操作のため、という風にね。余談だけど、Zigの存在意義の一部は、Cのポインタベースのデータ構造やそれに伴うパターンを許容しつつ、Cの問題を修正することにあるんじゃないかって思ってる。

5
throwaway27448
約19時間前

なんで2026年にもなってまだCの話をしてるんだ?HP-UXでも使ってるなら別だけど、わざわざ自分を縛り付けるようなことして何が楽しいの?