2017-09-08 93 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; 
} 

爲什麼第一個代碼不工作,而第二個代碼工作?

+1

節點x =節點(10); return&x;您正在傳遞基於堆棧的變量的地址,因此行爲將不明確 – Asesh

+0

您的第一個代碼返回一個指向不再存在的對象的指針,當您嘗試使用指針時 – user463035818

+2

在您的第一個代碼中,您正在創建一個Node對象在堆棧和函數退出的時刻,它超出了範圍,因此指向該內存的指針無效。這就是你得到錯誤的原因。 在你的第二個代碼中,Node對象是在Heap上創建的,它是很長的活動對象,指向它的指針將保持有效直到它被delete操作顯式刪除 –

回答

1

除非它是動態分配或靜態變量,否則不應該返回對局部變量的引用,因爲函數返回時會將其銷燬,然後您將嘗試訪問您無權訪問的區域。

相關問題