您不释放指针,而是释放分配的内存块-指针指向其地址。
使用malloc
,它返回指向分配的内存块的指针,如下所示:
+--------+
| |
new_node --> | 0x1000 |
| |
+--------+
如果0x1000
是该内存块的起始地址,则new_node
指向的内容(即new_node == 0x1000
)。
将new_node
分配给temp_node
时,temp_node
指向相同的内存块(即temp_node == 0x1000
):
+--------+
| |
new_node --> | 0x1000 | <-- temp_node
| |
+--------+
但是您只分配了一块内存。因此,一旦您通过任一指针释放了它,另一个指针就会自动失效,并且不再允许您通过任一指针访问该块。
以相同的方式,您可以将其分配给任意数量的指针,但是只要通过一个指针将其释放,就可以完成。这就是为什么在四处复制指针时需要格外小心(因为如果释放指针,它可能仍会被无意使用)。
P.S .:释放指针之后可能会指向NULL,也可能不会指向NULL,这只是访问释放内存的未定义行为。
,
有很多例外情况,但是作为一般规则,每次调用free
时都应该恰好有一个调用malloc
。
当您将一个指针变量分配给另一个指针变量时,您正在复制指针值-您不分配更多的内存。因此,指针复制不会不是暗含需要再次调用free
。
,
思考的方式类似于:指向存储位置的指针指向。
free()
将指针指向的内存返回系统。
因此,如果您有两个指针-调用free
后,内存将返回给系统。您仍然有两个指针。而且它们仍然指向相同的存储位置。只是现在这不是您的记忆,而是系统的:)
简而言之-free
的次数是您malloc
的次数。
,
因为您正在释放内存,而我在这里只看到一个malloc
,所以您只应该free()
一次。
通常,对于每个malloc
,必须只有一个free
。
否则,将出现双重free
错误。
,
对于一个内存地址,您只需调用一次free
。
一旦调用free
,它将告诉操作系统您分配的内存可以再次使用。您不需要第二次调用free
(也不必这样做,因为那是未定义的行为)。
,
关于代码的一些注释
- 声明
struct *next
和struct *temp_node
指向
没有实例的未命名结构。
-
node
只是用于命名结构的结构标签
不能在像malloc(sizeof(node))
这样的表达式中使用。
如果这是您原本的意思:
struct node{
int data;
struct node *next;
};
struct node * new_node = malloc(sizeof(struct node));
struct node * temp_node = new_node;
那么这篇文章之前提供的答案是完全准确的。
,
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node * next;
}* first=NULL;
int main()
{
first=(struct Node *)malloc(sizeof(struct Node));
first->data=5;
first->next=NULL;
struct Node * t=first;
printf("%d",t->data);
free(first);
printf(" %d ",t->data);
}
在这种情况下,虽然 First 在 main 中被释放,然后 t 也会打印数据。
这表示分配的内存块可以进一步用于不同的分配,但它仍然存在并且可以在指针指向它时使用。
但如果进行了新分配,则该内存块可能会分配给另一个变量。因此在释放内存后,它的行为是未定义的。
本文链接:https://www.f2er.com/3141507.html