请问最后p2为什么不能free?

icelover 2004-05-05 09:36:56
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

struct stu
{
int num;
struct stu * next;
}

main()
{

int len =1 , i ;
struct stu *p1, *p2,*head, *new ,*newhead;

//建立链表

p1=p2=head = (struct stu * ) malloc ( sizeof (struct stu ) ) ;
printf("Input number ( 0: list end ) : ");
scanf( "%d",&p1->num);
while ( p1->num != 0 )
{
p1 = ( struct stu * ) malloc ( sizeof ( struct stu ) ) ;
printf("Input number ( 0 :list end ): " );
scanf("%d",&p1->num );
if(p1->num == 0 )
p2->next = NULL ;
else
{
p2->next = p1;
p2 = p1;
len ++ ;
}

}
// 输出原链表

p1=head;
printf("\n the orginal list :\n");
do
{
printf("%4d",p1->num);
if(p1->next !=NULL )
p1 =p1->next ;
}while ( p1->next != NULL ) ;
printf("%4d",p1->num);

//输出新链表

for( i=0;i<len;i++)
{
p2=p1=head;
while (p1->next != NULL )
{
p2 =p1;
p1 =p1->next;
}
if( i == 0 )
newhead = new = p1;
else
new= new->next =p1;
p2 ->next = NULL;
}
printf("\n THhe list :\n");

p1= newhead;
for( i=0;i<len; i++)
{
printf("%4d",p1->num);
p1=p1->next;
}
printf("\n");
free(p2);

}

为什么最后free(p2)会出错?
不是malloc和free应该配对出现吗?
...全文
44 4 点赞 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
compboy1 2004-05-05
因为你free了两次相同的地址空间,所以出错!
  • 打赏
  • 举报
回复
junnyfeng 2004-05-05
p2在前面已经用malloc分配了空间
----------------
p2的空间如果被其他指针指向(如p1),且执行了释放整个链表,那当然不用再free p2
  • 打赏
  • 举报
回复
icelover 2004-05-05
上面掉了一点东西,
p1=head;
while(p1)
{
head=head->next;
free(p1);
p1=head;
}
已经释放了整个链表,我想问的是,p2在前面已经用malloc分配了空间,而且在程序的
执行过程中没有赋值NULL,为什么在最后加上free(p2)就会执行时候出错呢?
  • 打赏
  • 举报
回复
junnyfeng 2004-05-05
p2这个指针没有给他分配空间,所以不能free

如果你要释放整个链表的话,只能遍历这个链表,逐个释放结点
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-05-05 09:36
社区公告
暂无公告