malloc并在C中免费

如果我有类似的东西

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

是节点q指向释放? 或者我必须将root传递给free函数?

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

要取消引用要么会调用未定义的行为。 这包括free拨打任何一个。

指针qroot指向赋值后的同一内存块。 因此,对free的调用将释放该块, qroot都悬空。

你可以写

 free(q); 

要么

 free(root); 

可互换的

 q == root 

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

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

通常,每个资源只需发布一次。 这与C ++不同,在C ++中,您可以实现(但可能不应该)非常复杂的资源管理逻辑。