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回だけ初期化すればよいので性能上も問題ない、という判断なのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]