2013-05-07 110 views
0

具有以下的基準,返回一個指針或用C

struct node{ 
    int value; 
    struct node *next; 
}; 

typedef struct node Node; 
typedef struct node *pNode; 

Node newNode(){ 
    Node n; 
    n.value = 5; 
    return n; 
} 

pNode newpNode(){ 
    pNode pn = (pNode) malloc(sizeof(Node)); 
    pn->value = 6; 
    return pn; 
} 

我讀的地方,如果內存釋放是由呼叫用戶函數來完成,應該使用newpNode(),以及以其他方式使用newNode( ),但這並不足以幫助我理解。

你能給我一些什麼時候應該使用newNode()和newpNode()的具體例子嗎?

編輯:忘了裏面的pn newpNode()

+0

您不需要在C程序中投射'malloc'的返回類型。 – 2013-05-07 03:44:04

回答

2

在這個簡單的例子,沒有強烈需要使用一個比其他。

當您調用newNode()時,調用函數以存儲從調用返回的節點的大小(在調用堆棧上)時分配內存。該內存可以被分配給一個變量,你會保持它周圍(調用堆棧上的內存將memcpy'd到本地變量):

Node n = newNode(); 

然而,作爲一個節點變得更爲複雜,你會遇到問題。例如,如果您有嵌套的數據結構,這些數據結構不會被複制,並且可能會在newNode()清除時被銷燬。另外,由於節點所需的內存變大(即更多字段),因此在堆棧上需要越來越多的內存來進行這些調用。這可以限制諸如遞歸之類的事情,或者只是一般的效率。

要處理這些限制,請在newPNode()中的堆上分配內存。無論節點的大小如何,這總是返回一個指針。但是,您必須確保您在以後明確地清理該內存,否則將發生內存泄漏。

+0

IIRC,OK從函數返回C中的struct# – 2013-05-07 04:02:17

+0

_例如,如果您有嵌套的數據結構,它們將不會被複制,並可能在newNode()清理完成時被銷燬._ This清除了很多。所以這就是爲什麼你總是使用指向下一個節點的指針,而不是實際的節點,對吧?因爲創建新節點並將其分配到最後位置的功能也可能會破壞它? 編輯:參考 - >實際節點 – 2013-05-07 04:03:03

+0

這裏的每個人都很困惑,爲什麼你繼續使用「參考」一詞。 C沒有參考。 C有實際的數據結構和指針。你在鏈表中使用指針的原因是你不知道它會持續多長時間,所以你不能預先分配空間(如果你這樣做的話,那實際上只是一個數組)。 – xaxxon 2013-05-07 04:04:40