K.Maebashi's BBS 削除ページ

以下の投稿を削除します。

[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回だけ初期化すればよいので性能上も問題ない、という判断なのかと思います。
パスワード:

管理者削除