C 中的 malloc 和 free

malloc and free in C

如果我有类似的东西

 struct Node *root;
 struct Node *q;

 root = malloc( sizeof(struct Node));
 q = root;
 free(q);

q指向的节点被释放了吗??还是我必须将 root 传递给 free 函数?

rootq的值相同,也就是说指向同一个内存位置。在调用 free(q) 之后,它们都是悬挂指针,因为它们指向的东西都已被释放,但它们仍然指向那个位置。

取消引用任何一个都会调用未定义的行为。这包括对其中任何一个调用 free

调用 free(q) 后,释放的内存不会以任何方式被清除或擦除。
qroot 仍然指向已分配的内存位置,但该内存位置已添加到可用内存块列表中,并且可以重新分配。您不得通过这些指针中的任何一个引用该内存位置,否则它将调用未定义的行为。

free 之后调用 qroot 指向释放的内存块。

一般情况下,每个资源只需要释放一次。这与 C++ 不同,在 C++ 中您可以实现(但可能不应该)相当复杂的资源管理逻辑。

指针qroot赋值后指向同一块内存。所以对 free 的调用将释放该块,并且 qroot 都悬而未决。

你可以写

free(q);

free(root);

以来可互换
q == root