C语言:释放指向struct的指针的内存

时间:2016-11-23 09:20:50

标签: c pointers struct malloc free

假设我已经声明了一个指向结构的指针,并使用这个定义

为malloc()赋值
typedef struct node {
    int info;
    struct node *next;
} NODE;

然后在代码中的某处我声明了两个指针

NODE *node1, *node2 = NULL;

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

我的问题,我应该使用" free()"释放node2就像人们总是通过 free(node1)对node1做的那样。确切地说,分配 node2 = node1;

的影响是什么

感谢。

4 个答案:

答案 0 :(得分:6)

当你这样做时

node1 = malloc(sizeof(NODE));

你有类似

的东西
+-------+      +-----------------------------+
| node1 | ---> | memory for a NODE structure |
+-------+      +-----------------------------+

在作业node2 = node1之后你改为:

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

换句话说,你有两个指针指向相同的内存。

尝试使用两个指针变量之一调用free将使两个指针无效。

答案 1 :(得分:2)

您既不释放node1也不释放node2。你释放他们指向的记忆。

考虑到这一点,应该清楚为什么你应该只调用free一次

答案 2 :(得分:1)

您应该将malloc()和家人返回的地址按顺序传递给free()以释放分配的内存。

在你的情况下,你只是将返回的地址分配给其他指针并在free中使用,这很好。

你不应该

node2 = node1;
node2 = node2 +1;

free(node2);

所以你可以在你的情况下使用其中一个释放内存

free(node1)free(node2)在您的案例中相同

答案 3 :(得分:1)

node1是一个指针,意味着它的值是已分配结构的虚拟内存地址。

仅为node2 = node1分配地址副本。

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