K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2201] c言語ポインタ完全制覇(改訂版)に関する質問
返信


投稿者:nana
2019/12/16 11:08:26

Link:
・スタックに関する質問

スタックというのは、データ構造なのか、そういった領域があるのか、いまいちわかっていません。
スタックに積むという表現がp.111あたりにありますが、自動変数の場合はCPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれるということなんでしょうか?

・ヒープに関する質問
p.135にmalloc()は、...「ヒープからメモリを取ってくる関数」ということになります。
と書いてありますが、
ヒープというのはもともとそういった領域が用意されているのでしょうか?

また、
p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、OSにお願いして領域を拡張してもらいます」
と書いてあります。

これは、もともとあるヒープ領域を拡張するという意味なのでしょうか?

初歩的な質問かと思いますが、お答えいただけると嬉しいです。


また、くだらないことかもしれませんが、
p.285のList 5-5 
1行目 include <stdio.h>で # が抜けているように思います。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2202] Re:c言語ポインタ完全制覇(改訂版)に関する質問
返信


投稿者:(ぱ)こと管理人
2019/12/20 00:24:07

Link:
こんにちは。

>スタックというのは、データ構造なのか、そういった領域があるのか、
>いまいちわかっていません。
>スタックに積むという表現が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>で # が抜けているように思います。

本当ですね。ご指摘ありがとうございます。正誤表に載せます。

(プログラムリストは、ソースから自動処理で編集さんに渡すテキストに
組み込んでいたので、元原稿にはコンパイルが通らないようなソースは
ないのですが…… 編集段階で#が抜けてしまったようです。著者としては
ゲラのチェックの段階で気付かなければいけなかったのですが……
もうしわけありません)
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2203] Re:c言語ポインタ完全制覇(改訂版)に関する質問
返信


投稿者:nana
2019/12/20 16:27:08

Link:
回答ありがとうございます。
そのページも読んでいたはずなのですが、理解できていなかったようです。

追加で、もう一つ質問があります。
p.241 のList4-5に関してなのですが、
char *slogan[7]; を渡す際に、
37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか理解できずにいます。

p.242 では read_slogan()関数には「charへのポインタの配列」を引数で渡していると
書いてありますが、なぜ slogan のみでcharへのポインタの配列を渡すことになるのかが
分かりません。

例えば、 char slogan[7]; を渡す場合は、
配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは
一応理解できています。

回答お願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2204] Re:c言語ポインタ完全制覇(改訂版)に関する質問
返信


投稿者:(ぱ)こと管理人
2019/12/21 18:06:45

Link:
すみません、不明点がいまいちよくわかりません。

>37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか
>理解できずにいます。

>例えば、 char slogan[7]; を渡す場合は、
>配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは
>一応理解できています。

おなじことです。

char slogan[7];

においてsloganの型は「charの配列」です。これを関数に渡すなら、
(配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。
式の中では配列はポインタに読み替えられるので、sloganの型は
「charへのポインタ」となります。

char *slogan[7];

においてsloganの型は「charへのポインタの配列」です。これを関数に渡すなら、
(配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。
式の中では配列はポインタに読み替えられるので、sloganの型は
「charへのポインタのポインタ」となります。

これで回答になっていますでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2205] Re:c言語ポインタ完全制覇(改訂版)に関する質問
返信


投稿者:nana
2019/12/21 19:03:55

Link:
回答ありがとうございます。
なんとなく分かった気がします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]