• ベストアンサー

グローバル変数の初期化のタイミング

#include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

初期化されないグローバル変数はBSS領域というメモリ区域に置かれます。 BSS領域に置かれる変数は、C言語のソースで宣言しなくても自動的にゼロに初期化されることになっています。 ただし組み込みなどではゼロ初期化されない環境も多く、ゼロ初期化されることを前提としたコードは安全ではありません。「言語仕様上正しいけれど実際には避けるべき」です。 実用コードを書こうと思ったときは気をつけてください。

参考URL:
http://www.ertl.jp/~takayuki/readings/info/no03.html
dic2008
質問者

お礼

BSS領域というものがあるんですね 初耳でした 実用コードを書こうというより やっておいて損はないということですね ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

規格上は保証されますが... > void main() フリースタンディング環境でしょうか? そうだとすると、多くの場合、スタートアップはご自身で実装することになるかと思います。 その際、BSSセクションをクリアする処理を正しく入れていないと、0で初期化されないことになってしまいます。

dic2008
質問者

お礼

いいえ、フリースタンディング環境ではありません WindowsXPとなります スタートアップなどの実装はコンパイラ、OSまかせですが 下の方がBSSについて教えてくださったので さらに理解が深まりました ありがとうございました。

noname#77845
noname#77845
回答No.1

ANSI-Cの言語仕様的にグローバル変数は特に指定がない限り宣言時0クリアされます。 但し、言語仕様に沿わない変なcコンパイラの場合はこの限りではありません。

dic2008
質問者

お礼

すっきりしました ありがとうございました

関連するQ&A