6

重複の可能性:
初期化されていないデータの動作は適切に指定されていますか?

次のコードを試しました

#include<stdio.h>
void main()
{
int i; \
printf('%d',i);
}

その結果、VC ++ではガベージ値が得られましたが、tcでは同じ値でした。正しい値は何ですか?初期化されていない変数のデフォルト値はゼロですか?または、ガベージ値が含まれますか?

次は同じです

#include<stdio.h> 
void main()
{
int i,j,num;
j=(num>0?0:num*num);
printf("\n%d",j);
}

上記のコードの出力はどうなりますか?

4

6 に答える 6

10

技術的には、初期化されていない非静的ローカル変数の値は不確定です[参照1]
要するに、それは何でもかまいません。このような初期化されていない変数にアクセスすると、未定義動作が発生します。[参照2]

[参照1]
C99セクション6.7.8初期化:

自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。

[参照2]

C99セクション3.18未定義動作:

この国際規格が要件を課していない、移植性のない、または誤ったプログラム構成、誤ったデータ、または不確定に評価されたオブジェクトの使用時の動作。

注:強調鉱山。

于 2012-06-27T19:31:02.660 に答える
4

ユニタライズされた変数へのアクセスは、CとC ++の両方で未定義の動作であるため、任意の値を読み取ることができます。

プログラムがクラッシュする可能性もあります。未定義の動作領域に入ると、すべての賭けが1から外れます。


1ポインタでない限り、初期化されていない変数にアクセスするとプログラムがクラッシュするのを見たことがありません。

于 2012-06-27T19:30:52.507 に答える
2

不確定です。コンパイラーは必要なことを実行できます。

于 2012-06-27T19:30:44.097 に答える
1

値は不確定です。初期化の前に変数を使用すると、未定義の動作が発生します。

于 2012-06-27T19:31:27.760 に答える
-1

未定義です。コンパイラ、オペレーティングシステム、プログラムの実行などによって異なる場合があります。特定の値ではない場合もあります。効果が定義されていないため、コンパイラはこのコードに対して好きなことを行うことができます。プログラム全体を最適化することを選択する場合があります。プログラムを、キーロガーをインストールしてオンラインバンキングのログイン情報をすべて盗むプログラムに置き換えることもできます。

値を知りたい場合は、設定するしかありません。

于 2012-06-27T19:32:18.600 に答える
-1

他の人が指摘しているように、値何でもかまいません。

これにより、バグを見つけるのが難しい場合があります。たとえば、デバッグビルドで1つの値を取得し、リリースビルドで別の値を取得したり、取得した初期値が以前のプログラムの実行に依存したりするためです。

レッスン:常に変数を初期化します。C#がフィールドの値を定義し、ローカル変数の初期化を必要とするのには理由があります。

于 2012-06-27T19:32:51.193 に答える