不相同!
free(p)指的是收回分配给它的空间,至于收回后p还指向之前的地址,不过里面的内容已经被清空了或者是乱码(这点可以编程输出一下p指向空间的内容,我在不同的机子上试的结果的不同,不过大多数是清空了的。
而赋值为NULL,就是让其指向NULL这个地址。但是分配给p的那块内存不会收回去,这样就会造成内存的浪费!
一般比较安全的写法是:free(p); p=NULL;即在free之后,再给p赋值为NULL。
原因:free指的是收回分配给p的空间,在内存中将通过malloc给p分配空间后,该块空间就处于已分配状态,当你free后,该块内存就处于空闲即可分配状态。
详细点说就是在内存中会有一个空闲区域和已分配的区域,malloc后将从空闲区为其分配一块内存空间,并将该块内存从空闲区中删除,放置到已分配的区域,当你free后就又将它从已分配的区域划分到空闲区域。而此时你定义的指针p还是存在的,变成了野指针。这样就会造成内存泄露,这样就会存在安全问题。所以要给p赋一个NULL值!
分享到:
相关推荐
PCB* p=NULL; PCB** p1=NULL; printf("\n 请输入希望产生的进程个数?"); scanf("%d",&num); getchar(); // if(num>=100){ // printf("您怎么要产生这么多进程!Demands Denied!"); // return false; // } ...
//free(p); } return(head); } /* function FirstOrderAccess0()功能:实现二叉树的前序遍历 二叉树前序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止, 依次访问所经过的节点,同时所经[节点...
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...
= NULL && p->next != NULL) { q = p; p = p->next; free(q); } } unsigned int GetPsgCount(PNODE psglist) { PNODE p; unsigned int s = 0; for (p = psglist->next; p != NULL; p = p->next) s++; ...
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&&...
if(p==NULL)return(0); else return(i); } int ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素 { int j=0; LinkList *p=L,*s; while(j<i-1&&p!=NULL) { j++;p=p->next; } if(p==NULL)return 0...
=NULL) { p=p->next; i++; } return i; }// Length2 2.19 Status delete(struct node head,int max,int min) { if(head!=NULL) { q=head; p=head->next; while(p&&(p->data<min""p->data==min)) { q=p; p=p->next; }...
#define pfree 0 /*process end*/ #define running 1 /*process running status*/ #define aready 2 /*process aready status */ #define blocking 3 /*process aready blocking status*/ typedef struct node ...
=NULL) //将多项式A中剩余的结点加入到和多项式中 pre->next=p; else pre->next=q; } void multipoly(node *ha,node *hb) { node *p,*q,*n,*m; p=ha->next; n=(node*)malloc(sizeof(node)); n->next=NULL; while...
=NULL&&p->next->num!=num) p=p->next; q=p->next; p->next=p->next->next; free(q); } void print(struct student *head) { struct student *p; int i; p=head->next; if(p==NULL) { printf("\nthere is no ...
//free(p); } return(head); } /* function FirstOrderAccess0()功能:实现二叉树的前序遍历 二叉树前序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止, 依次访问所经过的节点,同时所经[节点...
free(p); } running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else { (p->super)--; p->state='w'; sort(); /*调用...
free(q); } print_hash(node **A,int n) { int i; node *p; for(i=0;i;i++) { if(A[i]->next!=NULL) { p=A[i]->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } } } printf("\n"); } ...
精心整理 一:线性表 1.单链表应用 ... free(r); } else q=q->next; } p=p->next; } } int main(void) { creat_list(); out_put_list(); delete_list(); out_put_list(); return 0; }
float *p_i=NULL; float ** p_ij=NULL; float ** phi_ji=NULL; float c,c_pre,validate; float *sum=NULL; float p_j; printf("请输入信源的符号数:"); fscanf (stdin,"%d",&r); printf("\n"); ...
void DrawBezier(point *p) { point *q=(point*)malloc(sizeof(point)); q->x=p->x; q->y=p->y; point *b=q; point *g=q; point *c=(point*)malloc(sizeof(point)); point *s=p->next; int n=f.n-1; ...
p->next=NULL; while(q!=NULL) { q->next=p; (*L)->next=q; p=q; q=r; if(r!=NULL) r=q->next; else break; } } void main() { LinkList list1; InitList(&list1); create_tail(&list1, ...
free(p); } void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else { (p->super)--; p->state='w'; sort(); /...
p->next=NULL;q->next=p; q=p; i++;} p->next=(*L)->next; } void PrintList(LinkList L) { int i=0;LinkList p;p=L->next; while(i<L->data) { printf("%5d",p->data); p=p->next;i++; } printf("\n"); } ...
node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p)) /*查找不成功*/ { s=(node)malloc(sizeof(BSTnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) *t=s; /*被插结点*s为新的根结点*/ else if...