2017-09-08 11 views
0

関数から構造体へのポインタを返そうとしていました。私は次のコードを書いたが、うまく機能せず、セグメンテーション違反があった。関数から構造体へのポインタを返す

#include <iostream> 

using namespace std; 

struct Node { 
    int val; 
    Node* next; 
    Node(int x): val(x), next(NULL) {}; 
}; 

Node* f(int a){ 
    Node x = Node(10); 
    return &x; 
} 

int main(){ 
    Node *x = f(10); 
    cout << x->val << "\n"; 
    return 0; 
} 

次のコードは正常に動作しましたが、

#include <iostream> 

using namespace std; 

struct Node { 
    int val; 
    Node* next; 
    Node(int x): val(x), next(NULL) {}; 
}; 

Node* f(int a){ 
    Node *x = new Node(10); 
    return x; 
} 

int main(){ 
    Node *x = f(10); 
    cout << x->val << "\n"; 
    return 0; 
} 

2番目のコードは正常に機能しないのはなぜですか?

+1

ノードx =ノード(10)。 return&x;スタックベースの変数のアドレスを渡しているため、動作は定義されません – Asesh

+0

ポインタを使用しようとすると、最初のコードはオブジェクトにポインタを返しません – user463035818

+2

最初のコードでは、Nodeオブジェクトを作成しています関数が終了する瞬間に有効範囲外になり、そのメモリへのポインタが無効になります。そういうわけで、あなたは責任を取っています。 2番目のコードでは、ノードオブジェクトはヒープ上に作成され、長い生きているオブジェクトであり、それに対するポインタは 'delete'操作によって明示的に削除されるまで有効です –

答えて

1

ローカル変数への参照は、関数が返ってきて破壊されてから、あなたが権利がない領域にアクセスしようとするので、動的変数または静的変数を参照しないでください。

関連する問題