1. ホーム
  2. c

[解決済み] C言語で宣言され、初期化されていない変数はどうなるのでしょうか?それは値を持っていますか?

2022-04-26 16:13:12

質問

C言語で書くと。

int num;

に何かを割り当てる前に num の値は num 不定期?

解決方法は?

静的変数(ファイルスコープ、関数スタティック)が0に初期化される。

int x; // zero
int y = 0; // also zero

void foo() {
    static int x; // also zero
}

非静的変数(ローカル変数)は 不定期 . 値を代入する前に読み込むと、次のような結果になります。 未定義の動作 .

void foo() {
    int x;
    printf("%d", x); // the compiler is free to crash here
}

実際には、最初は無意味な値を入れてしまいがちです。コンパイラによっては、デバッガで見たときにわかるように、特定の固定値を入れることもあります。しかし、厳密に言えば、コンパイラはクラッシュから召喚まで自由に行うことができます 鼻の穴から悪魔が .

なぜ単純に "未定義/任意値" ではなく、未定義の動作なのかというと、CPUアーキテクチャの中には、様々なタイプの表現に追加のフラグビットを持つものが多数存在するからです。最近の例では Itanium は、レジスタに "Not a Thing" ビットを備えています。 もちろん、C標準の起草者たちは、もっと古いアーキテクチャも考慮していました。

これらのフラグビットが設定されている値を扱おうとすると、以下のような操作でCPUの例外が発生することがあります。 本当に は失敗しないはずです(例:整数の加算、別の変数への代入)。また、初期化されていない変数をそのままにしておくと、コンパイラはフラグビットがセットされたランダムなゴミを拾ってくるかもしれません。つまり、初期化されていない変数に触れることは命取りになるかもしれないのです。