[2202] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/20 00:24:07
こんにちは。
>スタックというのは、データ構造なのか、そういった領域があるのか、
>いまいちわかっていません。
>スタックに積むという表現がp.111あたりにありますが、自動変数の場合は
>CPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれる
>ということなんでしょうか?
スタックという言葉自体は広くはデータ構造を指すので、配列や連結リストで
スタックを作ることもありますが、Cにおける自動変数の領域の確保は、
通常はCPUに組み込みで備わっているスタックの機能を使います。
p.114 List 2-6のアセンブリ言語を見ると、%rsp(スタックポインタ)という
レジスタが登場しています。これにsp(stack pointer)という名前が付いている
ことから、このスタックがCPU組み込みの機能であることがわかるでしょう。
もし、CPUに組み込みのスタック機能がないとしたら、別のレジスタやメモリを
スタックポインタに使って同等の機能を実現することはできるでしょうが、
その場合、pushq(List2-6の4行目)やpopq(16行目)のように、1命令でスタックに
値を積んだり取り出したりはできなくなります。スタックは有用な機能なので、
昔から、たいていのCPUには組み込みのスタック機能が付いています。
スタックの領域は、p.100のFig.2-3にあるとおり、仮想アドレスのどこかに
OSにより割り当てられています。
>ヒープというのはもともとそういった領域が用意されているのでしょうか?
これもp.100のFig.2-3にあるとおり、仮想アドレスのどこかにOSにより
割り当てられています。
>また、
>p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、
>OSにお願いして領域を拡張してもらいます」
>と書いてあります。
>これは、もともとあるヒープ領域を拡張するという意味なのでしょうか?
そうです。Fig.2-3の「malloc()により確保された領域」が下に伸びるイメージです。
>また、くだらないことかもしれませんが、
>p.285のList 5-5
>1行目 include <stdio.h>で # が抜けているように思います。
本当ですね。ご指摘ありがとうございます。正誤表に載せます。
(プログラムリストは、ソースから自動処理で編集さんに渡すテキストに
組み込んでいたので、元原稿にはコンパイルが通らないようなソースは
ないのですが…… 編集段階で#が抜けてしまったようです。著者としては
ゲラのチェックの段階で気付かなければいけなかったのですが……
もうしわけありません)