您的位置:首页 > 其它

free()函数使用随笔

2010-05-23 21:50 267 查看
void CreateList(LinkList L,int n)
{
int i,e;
LinkList p,s;
// L=(LinkList)malloc(sizeof(struct LNode));
(L)->next=L;
p=L;
(L)->id=1;
printf("请输入第一个人的密码:/n");
scanf("%d",&e);
(L)->code=e;
for(i=2;i<=n;i++)
{
s=(LinkList)malloc(sizeof(struct LNode));
printf("请输入第%d个人的密码:/n",i);
scanf("%d",&e);
p->next=s;
p=s;
s->next=(L);
s->id=i;
s->code=e;
}
}

void Joseph(LinkList L,int m)
{
int i,flag=1;
LinkList p,q,r;
p=q=L;
while (flag)
{
for(i=1;i<m;i++)
{
q=p;
p=p->next;
}
if(p==q) flag=0;
r=p;
q->next=p->next;
p=p->next;
m=r->code;
printf("第%d个人出列,密码:%d/n",r->id,r->code);
free(r);
}


最后free(r)的时候程序会出错,但是编译器不会报错。后来经过网友帮助得知:ln是一个栈变量,可楼主后来free(r)的时候,r正好指向ln。free的参数必须是由malloc返回的。free栈变量是一个undefined behavior,当然,大部分情况下意味着crash。

因为第一个节点La=&ln;是一个站变量,创建大小非通过malloc返回的;所以当free(r)时若指向ln的地址则会出错。所以可以更改函数返回类型 :

LinkList CreateList(LinkList La)
{
LinkList newCreateList = malloc(...);
newCreateList.xxx = ...;
newCreateList.next = NULL;

...

return L;
}

这样可以避免free()函数的出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: