- ベストアンサー
グローバル変数の初期化のタイミング
#include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
初期化されないグローバル変数はBSS領域というメモリ区域に置かれます。 BSS領域に置かれる変数は、C言語のソースで宣言しなくても自動的にゼロに初期化されることになっています。 ただし組み込みなどではゼロ初期化されない環境も多く、ゼロ初期化されることを前提としたコードは安全ではありません。「言語仕様上正しいけれど実際には避けるべき」です。 実用コードを書こうと思ったときは気をつけてください。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
規格上は保証されますが... > void main() フリースタンディング環境でしょうか? そうだとすると、多くの場合、スタートアップはご自身で実装することになるかと思います。 その際、BSSセクションをクリアする処理を正しく入れていないと、0で初期化されないことになってしまいます。
お礼
いいえ、フリースタンディング環境ではありません WindowsXPとなります スタートアップなどの実装はコンパイラ、OSまかせですが 下の方がBSSについて教えてくださったので さらに理解が深まりました ありがとうございました。
ANSI-Cの言語仕様的にグローバル変数は特に指定がない限り宣言時0クリアされます。 但し、言語仕様に沿わない変なcコンパイラの場合はこの限りではありません。
お礼
すっきりしました ありがとうございました
お礼
BSS領域というものがあるんですね 初耳でした 実用コードを書こうというより やっておいて損はないということですね ありがとうございました。