假设我已经声明了一个指向结构的指针,并使用这个定义
为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;
的影响是什么感谢。
答案 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)
是等效的。