1

Visual Studio 2012で実行時に次のコードがクラッシュするのはなぜですか?実際に使用していなくても、初期化されていない変数が原因でコードがクラッシュする

void foo(void* ptr) 
{ 

} 

int main() 
{ 
    void* ptr; 
    foo(ptr); 
} 

ランタイムチェックの失敗#3 - 変数 'ptr' は が初期化されずに使用されています。私はこのエラーが「デフォルト」に「Basicランタイムチェック」オプションを設定することで無効にすることができますが、私は私が指定したデリファレンス実際にないとき、私はこのエラーを持つべき理由何らかの理由が表示されないことを知ってい

ポインタ。

意図的な動作ですか?

+1

確かに、値でポインタ値を渡しています。このようなコードを書く必要がある理由は何もありません。さて、それを習慣にして、メッセンジャーを撃たないでください。 –

+0

実際には関数呼び出し時に_used_です。 –

+0

値が不定である式を評価しています。スタンダードはそれがUBだと言います。それがUBでない場合、その価値は何であると定義されていますか? –

答えて

3

関数へのポインタを渡すだけでも、それを「使用」しています。値が初期化されていないと、技術的に未定義の動作になります。

ポインタが特別なレジスタに渡され、それらを無効な値で設定するハードウェアプラットフォームでは、レジスタがに設定されたときにハードウェアトラップが生成されます。

解決策はチェックを無効にするのではなく、ポインターを使用する前に初期化します。使用する価値がわからない場合は、nullptrに行ってください。

+0

"関数へのポインタを渡すだけでも、"それを使用しているため、技術的に未定義の動作です " - 標準を引用できますか? – FrozenHeart

+0

それはあなたが意味する正確な基準に依存しますが、 "* ....評価によって不確定な値が生成された場合、その動作は未定義です... *"ここでは、 'ptr'を関数呼び出しは不確定な値を生成します。 –

+0

私はこれのために別の質問を作成しました - http://stackoverflow.com/questions/39681349/is-passing-an-unitialized-variable-to-another-function-ub – FrozenHeart

関連する問題