2011-01-10 6 views
2

Cでは、intsやfloatのようなプリミティブは、最初に宣言されたときに0に初期化されています。プリミティブを含む構造体が宣言されている場合も同様です。プリミティブが初期化されていないかどうかを確認する簡単な方法を見つけるのが難しいです。Primitiveが初期化されていないかどうかを確認する簡単な方法?

たとえば、ヘッダファイルに宣言されたint型のインスタンス変数があるとします。実装コードでこの変数を使用する必要があります。この値が初期化されているかどうかを知ることは重要です。ゼロをチェックすることは実際にはオプションではありません。なぜなら、その値が実際にゼロであると想定されている場合、既に変更された値を再初期化したからです。ポインタがないので、NULLをチェックすることもできません。

私が思いついた唯一の解決策は、実行可能コードの最初の部分の変数を、私が知っているいくつかの値にプログラムの残りの部分と関連性がないように初期化することです。たとえば、値がゼロ以下にならない場合は、-1に初期化してまだ初期化されていないことを確認します。しかし、これは本当に厄介なようですが、変数を割り当てることができる値の範囲が変更されると問題を引き起こす可能性があります。

この種の問題のお勧めはありますか?前もって感謝します!

+0

初期化されていない変数を使用するには、UBあります。 スイッチ-Wall(gcc)を渡すと、初期化されていない変数をすべて追跡できます。 gccは次のような報告をします: 'ddd.c:8:warning: '私はこの関数で初期化されていません' –

答えて

7

ご理解に間違いがあります。ローカル変数は、intまたはfloatに関係なく、初期化されません。

static変数のみがゼロに初期化されます。使用前にすべてを初期化する必要があります。実装が変数を初期化すると感じたとしても、それに頼るべきではありません。この規格は何も保証しません。未初期化変数の使用は未定義の動作です。

+0

私を訂正していただきありがとうございますが、これは私の質問には答えません。インスタンス変数を後でプロシージャまで割り当てることができない場合、インスタンス変数をどのように初期化すればよいでしょうか?他のプロシージャで初期化されているのか、初期化されていないのかを確認するにはどうすればよいですか? – zanneth

+0

@Zanneth:変数そのものは一切チェックしないでください。使用する前に、常に変数を初期化する必要があります。何らかの理由で遅延初期化メカニズムに頼らざるを得ない場合は、フラグを保持しておかなければなりません(同じ変数内に-1のような値、受け入れ可能な値の範囲外の場合、または変数の初期化を追跡します)。 –

2

グローバルプリミティブ、ポインタ、およびデータ構造体のみがゼロで初期化されます。ローカル変数またはmalloc() 'メモリはありません。

0

スタティックな記憶期間を持つオブジェクトがゼロに初期化されるゼロと、コードが明示的に設定したゼロとの間には違いはありません。ゼロはちょうどゼロです。

あなたがすることができるすべては、明示的に(それを定義.cファイル内の)非ゼロの非有効な番号でそれを初期化です:

がfoo.h:

extern double foo; 

foo.cを:

double foo = NAN; 

あるいは、それが初期化されていますかどうかを示すフラグ変数とそれに伴う:

がfoo.h:

extern double foo; 
extern int foo_initialised; 

のfoo.c:

double foo; 
int foo_initialised;