[解決済み] 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の例外が発生することがあります。 本当に は失敗しないはずです(例:整数の加算、別の変数への代入)。また、初期化されていない変数をそのままにしておくと、コンパイラはフラグビットがセットされたランダムなゴミを拾ってくるかもしれません。つまり、初期化されていない変数に触れることは命取りになるかもしれないのです。
関連
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] JavaScriptで変数が存在するか(定義されているか/初期化されているか)をチェックする
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C++の配列コピー
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] mallocで文字列を確保する
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?