2013-01-13 110 views
2

我想使該函數返回特定節點的地址。但編譯器是 不檢測我創建的節點數據類型結構。如何使函數返回一個結構指針在c + +

struct node 
{ 
int data; 

node *link; 
}; 

node *header,*current; 
node traverse(int pos); 


node *Linkedlist::traverse(int pos) 
{ 
    int location = 0; 
    current->link = header->link; 
    node *address = new node; 
    address->data = NULL; 
    address->link = NULL; 


    while(current->link != NULL) 
    { 

     if(location == pos) 
     { 
      cout <<current->link->data <<" "<< endl; 
      address->link=current->link; 
     } 
     location ++; 
     current->link = current->link->link; 

    } 


    return address->link; 
} 
+2

由於這是一個C++問題,請考慮'std :: unique_ptr'和/或'std :: shared_ptr'。如果你發現自己經常寫「新」和「刪除」,那麼你可能做錯了什麼。 –

+0

我不明白你的問題。請更準確地說你在問什麼。另外,你的代碼似乎有太多的錯誤和不好的做法。 – mualloc

回答

5

變化

return *address; 

return address; 
1

由於地址是一個指針變量節點,則需要簡單地返回變量。

A *前面的指針變量是一個明確的引用,這意味着獲取指針變量指向的值address。這與運營商&完成的操作相反,即獲取變量的地址。

return address; 

所以它的邏輯是你應該返回變量而不是返回變量指向的值。

請注意,traverse的調用者需要注意通過調用delete明確釋放內存,否則會導致內存泄漏。這是因爲潛在的設計問題,您已經在本地範圍內分配了一個堆對象並返回了該地址。

node * foo = Linkedlist::traverse(n); 
............... 
delete foo; 

你可以簡單地創建對象在堆或將其添加爲一個類的成員,其中在前一種情況下,你可以很容易地從一個範圍轉移標的物的所有權轉讓給其他,其中在第二情況下,對象的生命週期將由對象控制Linkedlist