2011-06-14 101 views
0

我在c代碼中有以下方法。爲什麼沒有創建新節點?

void add(int number) 
    { 
    Node node1; // a new node should be created 
    createNodeRelationshipBetween(&node1, current); 
    setData(&node1, number); 
    setCurrentNode(&node1); 
    incrementSize(); 
    printf("Inserted Node [data:- %d, Node address:- %p\n", node1.data, &node1); 
    } 

其中節點作爲

typedef struct node 
{ 
    struct node *prior; 
    struct node *next; 
    int data; 
} Node; 

我打電話添加()在一個循環中被定義。我的理解是,每次我調用add(i)時,都應創建一個新節點。相反,當我打印節點1的地址時,每次都是一樣的。有人可以請解釋錯誤在哪裏,我如何創建一個新的節點?

回答

3

您的函數確實會創建一個新的Node,但僅作爲局部變量。當您的add()函數返回時,它將消失。如果您在循環中調用add(),則堆棧上的Node對象的地址始終相同。

要使新的Node持續存在,您需要爲其分配一些持久性內存 - 請查看malloc(3)free(3)。一個簡單的例子:

Node *node1 = malloc(sizeof(Node)); 

您需要跟蹤node1指針以免引入內存泄漏。您稍後可以使用free(3)銷燬分配。

5

該代碼正在堆棧上創建節點結構。只要你離開節點被銷燬的功能。指針是相同的,因爲它每次都指向堆棧上的同一局部變量。解決的辦法是在堆中分配空間像malloc的東西變量:

malloc(sizeof(Node)) 

然後可以使用返回的指針在你的方式。完成後請不要忘記free節點。

+0

我認爲這個答案的最後一句應該是:不要忘記*當你完成時釋放節點。 – Xint0 2011-06-14 23:51:28

+0

@ Xint0:true:) – 2011-06-14 23:52:21

1

node1是一個局部變量,因此每次調用函數時都會重新創建它,並在每次返回時銷燬。

1

節點1是局部的你的附加功能 - 如果你想讓它堅持認爲功能之外,則使用malloc

1

Node不是由線Node node1;創建分配關堆。這行只聲明瞭一個變量,它的作用域被限制在函數的生命週期中(也就是變量被放在堆棧上)。函數返回時,node1不再存在。

因爲你是在一個緊密循環中調用add(),什麼是可能發生的是,每次調用add()是越來越分配相同的堆棧範圍和node1恰好在每次調用函數時具有相同的地址。

如果add()的每個調用都需要唯一的node1具有唯一地址,那麼您將需要動態分配該對象malloc

相關問題