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()函数的出错。
相关文章推荐
- jmeter随笔(31)--RandomString和Random函数使用
- C 语言中 malloc、calloc、realloc 和free 函数的使用方法
- fork函数使用随笔(转)
- fork函数使用随笔
- 使用malloc()和free()函数分配和释放内存
- 详解C语言中free()函数与getpagesize()函数的使用
- free 函数的使用
- C编程中的malloc()和free()函数使用详解
- C语言中mallloc()和free()函数的使用和分析
- 用于队列的数据函数供今后使用
- 静态成员与静态成员函数的使用
- C# 小数点后保留两位小数,四舍五入的函数及使用方法
- 使用stringByTrimmingCharactersInSet函数过滤字符串中的特殊符号
- python中使用sys模板和logging模块获取行号和函数名的方法
- 使用纯C函数指针调用C++的类成员函…
- 动态管理视图和函数的使用
- printf函数使用技巧
- 使用MDK创建stm32 库函数工程简单教程
- 使用函数传递参数来执行数据库操作
- realloc/setjmp函数使用举例