プロが教える店舗&オフィスのセキュリティ対策術

#include <stdio.h>

int i;
void main()
{
int j;
printf( "%d\n", i );
printf( "%d\n", j );
}

この結果が
0
-85899346
になるのですが
グローバル変数 int i は初期化しなくても 0 になるということは
保証されているのでしょうか?

A 回答 (3件)

初期化されないグローバル変数はBSS領域というメモリ区域に置かれます。


BSS領域に置かれる変数は、C言語のソースで宣言しなくても自動的にゼロに初期化されることになっています。

ただし組み込みなどではゼロ初期化されない環境も多く、ゼロ初期化されることを前提としたコードは安全ではありません。「言語仕様上正しいけれど実際には避けるべき」です。
実用コードを書こうと思ったときは気をつけてください。

参考URL:http://www.ertl.jp/~takayuki/readings/info/no03. …
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/12 16:13

規格上は保証されますが...



> void main()

フリースタンディング環境でしょうか?
そうだとすると、多くの場合、スタートアップはご自身で実装することになるかと思います。
その際、BSSセクションをクリアする処理を正しく入れていないと、0で初期化されないことになってしまいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/12 16:15

ANSI-Cの言語仕様的にグローバル変数は特に指定がない限り宣言時0クリアされます。



但し、言語仕様に沿わない変なcコンパイラの場合はこの限りではありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/26 13:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!