`
dawning126
  • 浏览: 46226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

free(p)和p=NULL的区别

    博客分类:
  • C
  • C++
阅读更多


不相同!

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...

    C语言链表基本操作.pdf

    if (NULL == p) { // 内存分配失败 } else { p->next = NULL; return p; } } ``` 二、链表的插入 链表的插入是指在链表中插入一个新节点。该操作可以在链表的任意位置插入新节点。代码如下所示: ```c void ...

    数据结构单链表实验报告.pdf

    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...

    动态分区分配方式的模拟C语言代码和C++代码.pdf

    5. 最后,我们需要实现回收函数free(),该函数将根据作业的编号和大小来回收空闲分区,并更新空闲分区链。 四、实验结果 在实验中,我们将使用首次适应算法和最正确适应算法来模拟动态分区分配过程,并显示出每次...

    我要用链表 操作链表的函数们

    PNODE p = NULL; p = (PNODE)malloc(sizeof(NODE)); if (p != NULL) { p->next = NULL; p->data = data; } return p; } ``` 该函数首先为新节点分配内存空间,并检查是否成功分配。如果分配成功,则初始化...

    C语言单链表的基本操作.pdf

    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&&...

    C语言链表定义及其基本操作

    = 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...

    链表的创建-插入-删除(数据结构 c编译)

    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 之后 ...

    数据结构课后习题 - 第二章问题.pptx

    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. 逆转线性链表 **算法思想**:通过迭代方式,将当前...

    单列表的操作实现.docx

    =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; } ``` 以上就是单链表基础操作的主要知识点,通过这些基本操作,我们可以实现对单链表的灵活管理。

    C++链表的反转

    free(p); p = q; } } ``` #### 四、链表排序 - **插入排序**:遍历链表,将每个节点插入到已排序的部分中的适当位置。 ```cpp void InsertionSort(List& L) { List h = L->next; // 原始链表头 L->next = ...

    C语言中常见内存错误及对策浅析

    free(p); // 错误:释放了一个静态分配的变量 ``` 正确的做法是只释放动态分配的内存: ```c int *p = malloc(sizeof(int)); // 正确做法 free(p); ``` ##### 1.3 使用释放后的内存空间 一旦内存被释放,就不应该...

    数据结构单链表操作

    if (*p == NULL) { printf("overflow"); // 如果内存分配失败,则输出错误信息 exit(0); } (*p)->next = NULL; // 设置头结点的 next 指针为空 } ``` 该函数首先分配内存用于存放头结点,然后将头结点的 `next...

    一元多项式运算(C++链表)

    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 ...

Global site tag (gtag.js) - Google Analytics