2017-02-27 8 views
0
#include <iostream> 

int Value() 
{ 
    int x = 90;//creates a variable x 
    return x;//returns the value x, into the caller 
    //x is destroyed because it is out of scope 
} 

int * ptr() 
{ 
    int x = 7;//creates variable x 
    return &x;//returns a pointer to x 
    //x gets destroyed because it is out of scope 
} 

では、私は私のウォッチウィンドウに= 7をPY *。 未定義の動作をしないでください。プログラムがクラッシュするはずです。ここで、pyはガーベッジを持つアドレスを指しています(ptr()のxは範囲外です)。値で戻り、アドレス

+2

UBの問題点は、可能性の1つは動作するように思われることです。呼び出しの順番を変えてみてください。値の呼び出し後に '* py'の値が変わることがよくあります。 –

+0

私は今私に0を与えました。ありがとう – Forat

+0

これは非常にコンパイラとOSにも依存しています。これは、すべての状況下で同じように動作することが保証されているのではなく、実装が定義されているため、定義されていない動作によって意味されます。 – ugar

答えて

1

関数ptrは値を返します。ローカル変数x。あなたの関数を終了する間、メモリモデルはこのアドレス(& x)を書き込み可能としてマークしますが、メモリ内の実際の値は削除されません。 メモリアドレスpyの実際の値を見ると、値7が表示されますが、別の関数がメモリを要求するときに値を変更できます。

0

dangling pointerになりました。使用すると問題が発生します。

1

は私がはい未定義の動作

を得るべきではありません。それがあなたのものです。

標準は、プログラムがクラッシュしなければならないことを規定していないプログラムがクラッシュ

号...べきではありません。代わりに、動作はn未定義です。