2016-05-01 4 views
4

これを実行すると、完全に "2"が出力されます。なぜ初期化されていないポインタに整数値を割り当てることができますか

int main() 
{ 
    int *p; 
    int x = 2; 

    *p = x; 

    cout << *p; 

} 

しかし、* pを最初に初期化してnullになると、プログラムがクラッシュします。

私は最初のプログラムにも成功した最初の場所で実行されないものをお願いしたいと思います
int main() 
{ 
    int *p=0; 
    int x = 2; 

    *p = x; 

    cout << *p; 

} 

、なぜ値が初期化されていないポインタに割り当てることができますか?

[編集]私の質問は、実際に私が得たこの過去の試験問題に関連しています。あなたは複数の答えに目を通すことができ、(b)&(c)の両方が正しいと思われます。しかし、今私は作品が純粋に運のためであるかどうかを知っています。

enter image description here

+0

初期化されていないポインタを使用しないでください。また、ポインタ変数を参照を追加するまでポインタ変数を逆参照しないでください。それ以外の場合は結果が得られます。 –

答えて

4

最初のプログラムは、未定義の動作の対象です。それはうまくいくように思えますが、残念なことに、見た目には正常な動作も未定義の動作です。

プログラムが初期化されていないポインタを参照していない場合は、常に正しく動作するとは限りません。

+0

あなたが本当に不運な場合、_undefinedビヘイビアもハードドライブのフォーマットを行う可能性があります_ – Destructor

3

初期化されていないポインタまたはNULLポインタデリファレンスは絶対に使用しないでください、あなたが行っていることは、世界で何が起こる可能性があり、未定義動作です。あなたのコードは実際に働いて、「合理的に」行動するのは純粋な運です。

なぜあなたのコードがそれをしたのかについては、あなたのコンパイラ&マシン& OSのふるまいに起因すると思われます。 pの変数宣言は、値が何でもよい初期化されていないメモリを予約するだけで、その値は読み書き可能なメモリ位置を参照するという意味で「幸運」でした。明示的に '0'に設定すると、あなたのOSが判読不能なメモリ位置である可能性のあるものを指し、それにアクセスしようとするとCPUがあなたのOSに苦情を言います。 この動作に頼らないでくださいこれはたぶん起こったことであり、将来同じシステム構成であっても発生しない可能性があります。

1

最初のコードでは、pが未定義のメモリを指していました。幸いにもそれは書き込み可能なメモリ領域でした。それは働いているように見えますが、C++の標準、私とここの皆さんがあなたを保証します。悪いことは確実に起こります。あなたは誰の場所、実際の生活の中で率直に言って、未定義intロード(読み込み)アドレス0でのデータの操作を...試みた、ので

int main() 
{ 
    int *p; //it may even point to the first variable on the main() stack, who knows?... 
    int x = 2; 

    *p = x; 

    cout << *p; 

} 

第二には、瞬時に失敗しました。読取りのためのオフセットは、メモリアドレス0+4、またはメモリアドレス0-4とすることができる....再び知っている。

初期化されていないポインタを使用しないでください!

関連する問題