K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>書籍ポインタ完全制覇で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回だけ初期化すればよいので性能上も問題ない、という判断なのかと思います。 > > >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!