2017-12-05 18 views
0

この単純なコードブロックは、予期しない動作をします。C++で匿名変数を有効にしようとする

#include <iostream> 
using namespace std; 


class Node 
{ 
public: 
    char* data; 
    Node(char d) 
    { 
     data = &d; 
    } 
}; 


int main() 
{ 
    Node NodeA = Node('c'); 
    cout<<*(NodeA.data)<<endl; 
    return 0; 
} 

私は出力として 'c'を得ようとしていましたが、代わりに '}'を出力しました。 "c"である無名変数に "data"ポインタを割り当てることに関連しなければならないと感じました。

これは、同様の問題を議論しているquestionです。

しかし、一番上の答えに記載されているように、匿名変数は、式の終わりまでに参照するポインタで囲まれていない場合にのみ、殺されます。私はポインタ( "データ")をバインドしているので、ここではそうではないと私は信じていますが、何とかそれはまだ殺されます。

予期せぬ出力を引き起こしていることをここで知りたいと思います。あなたのクラスで

+3

あなたは匿名の 'c ''へのポインタを取っておらず、_parameter_ 'd'へのポインタを取っています。 '' c''は_by value_で 'Node(char d)'に渡されます。 – Steve

+0

あなたはそれを匿名と呼びますが、関心のあるものは 'd'です - 私はローカルと呼んでいます。あなたのポインタがローカル変数が範囲外になったときに何が起こると思いますか? – UKMonkey

答えて

5

Node(char d) 
{ 
    data = &d; 
} 

文字dは、ノードのコンストラクタにパラメータです。問題は、dがプログラムスタックのローカルスコープ内にのみ存在することです。コードがコンストラクタから返ってくると、それは存在しなくなります。 データのアドレスは、プログラムスタックのどこかを指しています。データを読み込もうとすると、後でスタックにプッシュされた他のものを読むことができます。このアドレスに書き込むと、プログラムの他のいくつかの変数を上書きします。クラッシュしたり、予期せぬことが起こる可能性があります。

関連する問題