回答受付が終了しました

ID非公開

2020/9/16 21:17

44回答

Cをほぼ触ったことないので質問します。

Cをほぼ触ったことないので質問します。 ある程度専門的な回答を希望します。 ① int *hoge = NULL; とした場合 変数自体の格納領域にはなにが格納されるのでしょうか? (ポインタの指し示す先のメモリアドレスに何が格納されているのかという意味ではなく、ポインタの指し示す先のメモリアドレスを格納している領域に何が格納されるかが知りたいです。) int *hoge; とした場合と何か違うのでしょうか? ② ある関数fugaがメモリに展開されるタイミングはいつでしょうか? (fugaの実行直前にメモリに展開される、起動時に全てメモリに展開される、コンパイル時の指定による、など) 例えば、何処からも実行されない浮いた関数があった場合はどうなるでしょう? ③ あるモジュール(コンパイルで出来るもの)piyoがメモリに展開されるタイミングはいつでしょうか? 例えば、コンパイルには必要だが絶対に実行されないようなモジュールがある場合、どうなるでしょう?

C言語関連38閲覧xmlns="http://www.w3.org/2000/svg">100

回答(4件)

0

> ① > int *hoge = NULL; > とした場合 > 変数自体の格納領域にはなにが格納されるのでしょうか? 各処理系における null pointer constant の内部表現の値 0 の処理系がほとんどですが、過去 0 以外の処理系も存在しました。 > int *hoge; > とした場合と何か違うのでしょうか? C と C++ で違いがあります。以下は C における説明です。 関数内で記述するか関数外で記述するかで違います。 関数内で記述した場合は、不定値 関数外で記述し、他に関数外で hoge の宣言がない場合は null pointer constant の内部表現の値 関数外で記述し、他に関数外で hoge の宣言がある場合は、 その宣言によります。 > ② > ある関数fugaがメモリに展開されるタイミングはいつでしょうか? fuga を含むアプリのメモリ展開サイズが仮想メモリのスワップサイズよりも 小さければ、起動時にメモリに展開されるでしょう。

0

①int *hoge;でhogeの名前の付いたアドレスエリアが確保されるだけです。hogeの指しているアドレスに対しては何も操作は行われません,=NULLとする事で初期値NULL(\0)がhogeに設定されます。②関数のプログラムの部分は起動と同時にメモリに読み込まれますが、関数内で使うローカル変数は関数呼び出し時にメモリーに確保されます。③基本的にはプログラムは起動と同時に全てをメモリに読み込みます、ただし、最近のOSは仮想メモリ方式ですので、実メモリーでは無く仮想メモリー(実メモリーとHDD)に読み込まれます。

0

① NULLつまり0です。 > int *hoge; これがローカル変数なら内容は不定です。 ② 関数自体はプログラムがロードされた時点でメモリにある状態です。 > 例えば、何処からも実行されない浮いた関数があった場合はどうなるでしょ 次の疑問と被りますが、コンパイラの最適化オプションが優秀ならその関数は実行モジュールには出力されませんが、最適化されなければモジュールに出力されメモリにも展開されます。 ③ > 例えば、コンパイルには必要だが絶対に実行されないようなモジュールがある そんなものは存在しませんが、上記の通り最適化されれば出力されません。

1

①ヌルポインタ。通常 0をアドレス変換したもの。 int *hoge;だと何が入っているかは未確定。 ②起動時に読み込み始めて、実行前にメモリに展開される ③実行ファイルが、読み込みをするように動作したとき。 >例えば、コンパイルには必要だが コンパイルには必要ないと思います。 >絶対に実行されないような なら、実行されないでしょう。

1人がナイス!しています