C语言:释放指向结构体的指针的内存

4

假设我已经声明了一个指向结构体的指针,并使用以下定义和malloc()函数为其分配内存:

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

然后在代码的某个地方,我声明了两个指向它的指针。

NODE *node1, *node2 = NULL;

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

我的问题是,我是否应该像人们经常使用free(node1)释放node1一样使用free()来释放node2。赋值node2 = node1;的效果究竟是什么。

谢谢。


1
node1 是 node2。只释放其中一个,否则会崩溃。 - Jean-François Fabre
free 只知道地址,它不知道你有哪些变量,也不关心哪个指向哪个内存地址。 - phuclv
@Jean-FrançoisFabre。那么您的意思是说,我也可以通过free(node2)来释放node1,对吧? - James Real
4个回答

7
当你进行操作时
node1 = malloc(sizeof(NODE));

你有一个类似于:

+-------+      +-----------------------------+
| node1 | ---> | 指向 NODE 结构体的内存 |
+-------+      +-----------------------------+

在执行 node2 = node1 之后,你将得到以下结果:

+-------+
| node1 | -\
+-------+   \    +-----------------------------+
             >-> | 指向 NODE 结构体的内存 |
+-------+   /    +-----------------------------+
| node2 | -/
+-------+

换句话说,你现在有两个指针都指向同一段内存。

如果试图使用其中任何一个指针变量调用 free 函数,则会使这两个指针都失效。


2
你释放的不是node1node2本身,而是它们所指向的内存。
因此,你应该只调用一次free,这一点应该很清楚了。

1

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

node2 = node1 赋值只是复制了该地址。

因此,free(node1)free(node2) 是等价的。


1

为了释放已分配的内存,您应该将malloc()及其相关函数返回的地址传递给free()

在您的情况下,只是将返回的地址赋值给其他指针并在free中使用是可以的。

您不应该这样做:

node2 = node1;
node2 = node2 +1;

free(node2);

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

free(node1)free(node2)在您的情况下是相同的


@JamesReal 是的,你可以使用它们中的一个。 - Gopi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接