2017-07-15 14 views
-4

私はすでに、プログラムがスコープから外れると、変数が破壊されることを知っています。しかし、これは私が次のスニペットにコードをしようとしたときに発生していないようでした:ローカル変数への参照を返しても問題ありませんか?

int& somethin() 
    { 
     int x1 = 4; 

     return x1; 
    } 
    int main() {  
     int x11; 
     x11 = somethin(); 
     cout << x11 << endl; 

     return 0; 
    } 

は驚くべきことに、出力は次のようになります。4

私は参照変数として「X11」を宣言したときに、私が得る一方でゴミ値。

説明はありますか?

注:このテストを何度も繰り返しました。私はそれが運についてだとは思わない。 注:同じ質問をStackOverflowで以前に聞いた人がいますが、テスターに​​ついての答えは幸運でした。

+0

は、実行スタックがマシンにどのように機能するかを考えてみて - ほとんどのC++ランタイム環境がないゼロ飛び出しスタック・フレームをやる、それがなぜ参照の目標値です「4」はまだそこにあります - それはあなたがその行動に依存するべきではありません。 – Dai

+0

[私は0を持っています](http://cpp.sh/243to) – yrHeTaTeJlb

+5

これは未定義の動作です。つまり、特定の動作が起こる可能性があります。それが危険な理由です。 – StoryTeller

答えて

3

説明はありますか?

動作は未定義です。

標準では、未定義の動作が期待する動作を保証するものではありません。また、行動が常に同じであることを保証するものでもありません。私のコンピュータでは、結果はsegfaultです。

これは価値があると思いますが、具体的にはx1がメモリのどこかに格納されているので、値4はメモリのどこかに格納されています。関数呼び出しの後では、そのメモリはもはやx1のために使用されないので、他のもののために使用することができます。 x11はメモリのどこかに格納されます。同じメモリ位置が使用された場合、そのメモリ位置のガベージ値は4になる可能性があります。

参照変数として「x11」を宣言すると、ガベージ値が取得されます。

4もまたゴミ値です。

1

ローカル変数は、自動ストレージに格納されます。彼らが範囲外に出たとき、彼らは破壊されます。

ローカル変数への参照を返すと、言語の規則に違反するため、undefined behaviour(逆参照と同じようにnullptr)です。

x11の値は保証されていません。正しい結果が得られますが、それは言語機能ではありません。

あなたがここにundefined behaviourについての詳細を見つけることができます。 What are all the common undefined behaviours that a C++ programmer should know about?

関連する問題