free(p)和p=NULL的区别

5 篇文章 0 订阅
不相同!

free(p)指的是收回分配给它的空间,至于收回后p还指向之前的地址,不过里面的内容已经被清空了或者是乱码(这点可以编程输出一下p指向空间的内容,我在不同的机子上试的结果的不同,不过大多数是清空了的。

而赋值为NULL,就是让其指向NULL这个地址。但是分配给p的那块内存不会收回去,这样就会造成内存的浪费!

一般比较安全的写法是:free(p); p=NULL;即在free之后,再给p赋值为NULL。

原因:free指的是收回分配给p的空间,在内存中将通过malloc给p分配空间后,该块空间就处于已分配状态,当你free后,该块内存就处于空闲即可分配状态。

详细点说就是在内存中会有一个空闲区域和已分配的区域,malloc后将从空闲区为其分配一块内存空间,并将该块内存从空闲区中删除,放置到已分配的区域,当你free后就又将它从已分配的区域划分到空闲区域。而此时你定义的指针p还是存在的,变成了野指针。这样就会造成内存泄露,这样就会存在安全问题。所以要给p赋一个NULL值!
  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码存在以下错误: 1. push函数和pop函数的返回类型应该为void,因为它们没有返回值。 2. 在SearchNode函数中,如果key小于等于当前节点的值,应该将kpt指向左子节点,不然应该将kpt指向右子节点。 3. 在DeleteNode函数中,当q为要删除的节点时,如果p为NULL,应该将q的左子节点连接到q的右子节点的最左边节点,而不是最右边节点。 下面是修改后的代码: ``` #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef struct tree { int data; struct tree *lchild; struct tree *rchild; } TREE; typedef struct stack { TREE *t; int flag; struct stack *link; } STACK; void push(STACK **top, TREE *tree) { STACK *p; p = (STACK*)malloc(sizeof(STACK)); p->t = tree; p->link = *top; *top = p; } void pop(STACK **top, TREE **tree) { STACK *p; if(*top == NULL) { *tree = NULL; } else { *tree = (*top)->t; p = *top; *top = (*top)->link; free(p); } } void SearchNode(TREE *tree, int key, TREE **pkpt, TREE **kpt) { *pkpt = NULL; *kpt = tree; while(*kpt != NULL) { if((*kpt)->data == key) { return; } *pkpt = *kpt; if(key <= (*kpt)->data) { *kpt = (*kpt)->lchild; } else { *kpt = (*kpt)->rchild; } } } int InsertNode(TREE **tree, int key) { TREE *p, *q, *r; SearchNode(*tree, key, &p, &q); if(q != NULL) { return 1; } if((r = (TREE*)malloc(sizeof(TREE))) == NULL) { return -1; } r->data = key; r->lchild = r->rchild = NULL; if(p == NULL) { *tree = r; } else if(p->data > key) { p->lchild = r; } else { p->rchild = r; } return 0; } int DeleteNode(TREE **tree, int key) { TREE *p, *q, *r; SearchNode(*tree, key, &p, &q); if(q == NULL) { return 1; } if(p == NULL) { if(q->lchild == NULL) { *tree = q->rchild; } else { *tree = q->lchild; r = q->lchild; while(r->rchild != NULL) { r = r->rchild; } r->rchild = q->rchild; } } else if(q->lchild == NULL) { if(q == p->lchild) { p->lchild = q->rchild; } else { p->rchild = q->rchild; } } else { r = q->lchild; r->rchild = q->rchild; if(q == p->lchild) { p->lchild = q->lchild; } else { p->rchild = q->lchild; } } free(q); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值