2016-11-23 81 views
3

說我已經聲明瞭一個指針,結構和使用malloc在代碼中使用這個定義C語言:指針釋放內存結構

typedef struct node { 
    int info; 
    struct node *next; 
} NODE; 

然後某處分配給它()我聲明瞭兩個指針,它

NODE *node1, *node2 = NULL; 

node1 = malloc(sizeof(NODE)); 
node2 = node1; 

我的問題,我應該使用「自由()」來釋放節點2就像人總是這樣通過免費(節點)到節點1。賦值的效果究竟是什麼node2 = node1;

謝謝。

+1

節點1 _is_節點2。只是釋放其中一個不是兩個或它會崩潰。 –

+0

'免費'只是知道地址。它不知道你有什麼變量,也不關心指向哪個內存地址 –

+0

@ Jean-FrançoisFabre。所以你說的是我也可以通過free(node2)釋放node1,不是嗎? –

回答

6

當你

node1 = malloc(sizeof(NODE)); 

您有類似

 
+-------+  +-----------------------------+ 
| node1 | ---> | memory for a NODE structure | 
+-------+  +-----------------------------+ 

分配node2 = node1後您有代替本:

 
+-------+ 
| node1 | -\ 
+-------+ \ +-----------------------------+ 
      >-> | memory for a NODE structure | 
+-------+ / +-----------------------------+ 
| node2 | -/ 
+-------+ 

換句話說你有兩個指針指向相同內存。

嘗試撥打free使用兩個指針變量中的任何一個都會使指針無效兩個指針。

+1

這ascii藝術...... – StoryTeller

+0

感謝您的繪畫。現在很清楚。 –

1

您應該將由malloc()和家族返回的地址傳遞給free(),以釋放分配的內存。

在你的情況下,你只是將返回的地址分配給其他指針,並在免費使用這是很好的。

你不應該做

node2 = node1; 
node2 = node2 +1; 

free(node2); 

所以,你可以使用其中一個在你的情況,以釋放內存

free(node1)free(node2)你的情況是相同的

+0

好的。這意味着我只需要釋放其中一個。 –

+0

@JamesReal是的,你可以使用其中之一 – Gopi

2

你釋放既不node1也不是node2。你釋放他們指向的內存。

考慮到這一點,應該清楚爲什麼你應該只調用free一次

1

node1是一個指針,意味着它的值是分配的結構的虛擬內存地址。

指定node2 = node1只是複製該地址。

因此free(node1)free(node2)是等效的。