[2369] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/10 22:59:16
>書籍ポインタ完全制覇でC言語を勉強中の者です。
はじめまして。読んでいただきありがとうございます。
>該当の書籍のP-130-131のサンプルプログラムList2-9について質問なのですが、
>使用済みの数字かどうかを判定するフラグused_flagの初期値を最初にゼロにしている
>訳ではないのに、33行目のループの最初で0と判定してif文の中身を実行できるのは
>どうしてでしょうか?
このused_flagはグローバル変数であり、グローバル変数は静的記憶域期間を持ちます。
静的記憶域期間を持つ変数については、プログラムの起動時に初期化されることが
規格で規定されています。
JIS X 3010:2003「6.7.8 初期化」より。
| 静的記憶域期間をもつオブジェクトを明示的に初期化しない場合,次の規定に従う。
| a) そのオブジェクトの型がポインタ型の場合,空ポインタに初期化する。
| b) そのオブジェクトの型が算術型の場合,(正又は符号無しの)0 に初期化する。
| c) そのオブジェクトが集成体の場合,各メンバにa)~d)の規定を(再帰的に)適用し
| 初期化する。
| d) そのオブジェクトが共用体の場合,最初の名前付きメンバにa)~d)の規定を
| (再帰的に)適用し初期化する。
used_flagはintの配列なので、c)とb)の規則の合わせ技で0に初期化されます。
>自分なりに調べると、特にプログラマが初期値を指定しない場合の初期値は
>不定となるそうなのですが、それが何か関係しているのでしょうか。
自動記憶域期間を持つ変数(ローカル変数)や、malloc()でヒープに確保した領域は、
明示的に初期化しない限り値は不定になります。
2章で説明している通り、ローカル変数の領域は関数の呼び出しのたびに確保されますし、
ヒープの領域はmalloc()のたびに確保されます。こういう領域を毎回ゼロとかでクリア
するのは性能的に問題が出るかもしれませんが、静的記憶域期間をもつ変数はプログラムの
起動時に1回だけ初期化すればよいので性能上も問題ない、という判断なのかと思います。