不相同!
free(p)指的是收回分配给它的空间,至于收回后p还指向之前的地址,不过里面的内容已经被清空了或者是乱码(这点可以编程输出一下p指向空间的内容,我在不同的机子上试的结果的不同,不过大多数是清空了的。
而赋值为NULL,就是让其指向NULL这个地址。但是分配给p的那块内存不会收回去,这样就会造成内存的浪费!
一般比较安全的写法是:free(p); p=NULL;即在free之后,再给p赋值为NULL。
原因:free指的是收回分配给p的空间,在内存中将通过malloc给p分配空间后,该块空间就处于已分配状态,当你free后,该块内存就处于空闲即可分配状态。
详细点说就是在内存中会有一个空闲区域和已分配的区域,malloc后将从空闲区为其分配一块内存空间,并将该块内存从空闲区中删除,放置到已分配的区域,当你free后就又将它从已分配的区域划分到空闲区域。而此时你定义的指针p还是存在的,变成了野指针。这样就会造成内存泄露,这样就会存在安全问题。所以要给p赋一个NULL值!
分享到:
相关推荐
Node *p = NULL; if (L == NULL) { printf("异常\n"); return; } p = (Node *)malloc(sizeof(Node)); if (p == NULL) { printf("内存分配失败!\n"); return; } p->data = data; p->next = L->head; if...
p->lchild=NULL; p->rchild=NULL; if(T==NULL) T=p; else { q=T; if(item<q->data) InsertBiTree(q->lchild,item); else InsertBiTree(q->rchild,item); } return true; } bool CreateBiTree...
if (NULL == p) { // 内存分配失败 } else { p->next = NULL; return p; } } ``` 二、链表的插入 链表的插入是指在链表中插入一个新节点。该操作可以在链表的任意位置插入新节点。代码如下所示: ```c void ...
if(p==NULL) return(0); else return(i); } int GetElem(LinkList *L,int i,ElemType &e) { int j=0; LinkList *p=L; while(j<i&&p!=NULL) { j++; p=p->next; } if(p==NULL) return 0; else { e=p->data...
5. 最后,我们需要实现回收函数free(),该函数将根据作业的编号和大小来回收空闲分区,并更新空闲分区链。 四、实验结果 在实验中,我们将使用首次适应算法和最正确适应算法来模拟动态分区分配过程,并显示出每次...
PNODE p = NULL; p = (PNODE)malloc(sizeof(NODE)); if (p != NULL) { p->next = NULL; p->data = data; } return p; } ``` 该函数首先为新节点分配内存空间,并检查是否成功分配。如果分配成功,则初始化...
if (p == NULL) { // 没有找到值为 k 的结点 printf("The node %d is not exist\n", k); return 0; } else { q->next = t; t->next = p; return 1; } } } ``` #### 删除操作 删除操作是指移除链表中的...
LinkList p=NULL,s=NULL; int j=1,post; s=(LinkList)malloc(sizeof(LNode)); if(!s) printf("储存错误!!\n"); s->next=NULL; printf("请输入要查找的元素:"); scanf("%d",&s->data ); p=L; while(p&&...
= NULL && p->next->val != data) { p = p->next; } if (p->next == NULL) { return head; // 未找到指定节点 } ListNode* deleteNode = p->next; p->next = deleteNode->next; free(deleteNode); return...
if (p == NULL) { // 指定位置超出链表长度 printf("Position out of range.\n"); free(newNode); } else { // 插入到指定位置 newNode->next = p->next; p->next = newNode; } } } ``` #### 四、链表节点...
if (p == NULL) // 未找到第 i-1 个结点 return 0; else { // 找到第 i-1 个结点 *p s = (LinkList *)malloc(sizeof(LinkList)); // 创建新结点 *s s->data = e; s->next = p->next; // 将 *s 插入到 *p 之后 ...
if (p->next == NULL || p->next->data >= maxk) return OK; // 删除所有符合条件的元素 while (p->next != NULL) { if (p->next->data ) { q = p->next; p->next = p->next->next; free(q); } else { p =...
free(p); p = q->next; } else { q = p; p = p->next; } } if (list->data == item) { q = list; list = list->next; free(q); } } ``` #### 3. 逆转线性链表 **算法思想**:通过迭代方式,将当前...
=NULL&&p->data!=i) p=p->next; if(p->data==i) returnp; else { printf("wecannotfindit"); returnNULL; } } ``` ### 五、插入节点 在指定位置插入一个新节点。 ```c voidinsertNode(ListNode*head,inti...
if (p == NULL || p->next == NULL) return 0; q = p->next; p->next = q->next; free(q); return 1; } ``` 以上就是单链表基础操作的主要知识点,通过这些基本操作,我们可以实现对单链表的灵活管理。
free(p); p = q; } } ``` #### 四、链表排序 - **插入排序**:遍历链表,将每个节点插入到已排序的部分中的适当位置。 ```cpp void InsertionSort(List& L) { List h = L->next; // 原始链表头 L->next = ...
free(p); // 错误:释放了一个静态分配的变量 ``` 正确的做法是只释放动态分配的内存: ```c int *p = malloc(sizeof(int)); // 正确做法 free(p); ``` ##### 1.3 使用释放后的内存空间 一旦内存被释放,就不应该...
if (*p == NULL) { printf("overflow"); // 如果内存分配失败,则输出错误信息 exit(0); } (*p)->next = NULL; // 设置头结点的 next 指针为空 } ``` 该函数首先分配内存用于存放头结点,然后将头结点的 `next...
free(p); p = q; } L = NULL; } ``` #### 三、多项式的算术操作 ##### 1. 多项式加法 多项式的加法可以通过比较两个多项式中相同指数的项,然后合并它们的系数来完成。这里采用了先复制再合并的策略。 ```...
每次循环时,将 `p` 指向的节点的下一个指针指向 `q`,然后移动 `p` 和 `q` 的位置。 **示例代码:** ```c void Reverse(LinkList &list) { LinkList p, q, r; p = list; q = NULL; while (p != NULL) { r ...