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番目のコードは正常に機能しないのはなぜですか?
ノードx =ノード(10)。 return&x;スタックベースの変数のアドレスを渡しているため、動作は定義されません – Asesh
ポインタを使用しようとすると、最初のコードはオブジェクトにポインタを返しません – user463035818
最初のコードでは、Nodeオブジェクトを作成しています関数が終了する瞬間に有効範囲外になり、そのメモリへのポインタが無効になります。そういうわけで、あなたは責任を取っています。 2番目のコードでは、ノードオブジェクトはヒープ上に作成され、長い生きているオブジェクトであり、それに対するポインタは 'delete'操作によって明示的に削除されるまで有効です –