2016-11-23 117 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)是等效的。