free只能释放由堆动态申请的空间,但是第一个中p,q两个不同的指针变量指向同一片地址,
我们拥有十多年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都做网站、网站制作、微信开发、小程序设计、成都做手机网站、html5、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
free(q);
q = NULL;
后,q和p指向的空间被释放,且q被赋值为NULL,但是此时p变量的值并没有改变,即其值还是原来申请的空间的首地址。这里注意原来申请的空间已被释放,只是p还保留那篇空间的首地址值,所以一般开发中释放空间后,要把相关变量赋值为NULL,以防后面会非法访问一个已经释放的空间。
第二个,释放了。
清除链表是需要两根指针前后走的,可以看成是一个“过河拆桥”的过程 1)首先让两个指针p,q指向链表头; 2)然后让p指向q的next; 3)free掉q所指向的节点; 4)q指向p; 5)判断p是否为空,如果空,结束循环,否则转2)。
比如
int *a = (int*)malloc (100*sizeof(int));
int *b = a, *c = a + 10;
那么free(b) 和 free(a)是合法,他们的工作都是释放申请的a的内存100个int
再如用递归创建链表,
node* a = (node*)malloc(sizeof(node));
a-next = (node*)malloc(sizeof(node));
... ...
free(a)只释放node的申请内存,a-next不会释放,这样做会造成内存泄漏!
free的使用参考
你不紧 删除错了前面的新建链表也错了,我试了一下你的程序,存的时候是从前往后,输出的时候是从后往前
#include stdio.h
#include stdlib.h
struct Node{
int con;
Node *next;
};
Node* insert(Node *h,int a,int pos)//这里,增加返回类型
{
Node *p=(Node *)malloc(sizeof(Node));
Node *pt=h;
if (pos==0)
{
p-con=a;
p-next=h;
h = p;
}
else
{
for(int i=1;ipos;i++)//这里,如果pos值输入大于节点个数,会导致越界,自己修改
{
pt=pt-next;
}
p-con=a;
p-next = pt-next;
pt-next=p;
}
return h;//这里,返回地址
}
int main()
{
int i;
int count=0;
puts("Enter num");
scanf("%d",i);
Node *p=( Node *)malloc(sizeof( Node));
Node *head=p;
p-next=NULL;
p-con=i;
Node *c=head;
puts("Next one,nonnum to stop");
while(scanf("%d",i)==1)
{
fflush(stdin);
p=(struct Node*)malloc(sizeof(struct Node));
p-con=i;
c-next=p;
p-next=NULL;
c=p;
puts("Next one,nonnum to stop");
}
fflush(stdin);
int a,pos;
puts("insert a at pos");
scanf("%d %d",a,pos);
head = insert(head,a,pos);//这里,地址传出来
c=head;
while(c!=NULL)
{
printf("%d %d\n",count,c-con);
count++;
c=c-next;
}
c=head;
Node *tmp;
while(c!=NULL)//here,多了个分号,内存释放需要改
{
tmp = c;
c=c-next;
free(tmp);
}
return 0;
}
free(q); 释放q指针所拥有的资源,告诉系统,本程序不再使用该内存地址(free的功能就是这个)
q=q-next; 然后继续引用该地址,则程序可能会死掉!