C语言释放链表内存的问题

void ListFree(LinkList L)
{
LNode *s = NULL;
while(L)
{
s = L;
L = L->next;
free(s);
}
}
一运行到free处就出错0

把链表创建的函数贴出来。否则难以判断。
还有LNode 和LinkList的类型定义贴出来

再请求一次,把LNode 和LinkList的类型定义贴出来!

从 L->next;的用法,我推测LinkList是一个结构体指针类型,,作用是指向链表头。可是你在malloc的时候,用的sizeof(LinkList)),也就是对指针类型取size,通常固定是4,也就是说的你原意是要申请一个结构体大小的buff,结果是申请到一个指针大小的buf

如果LinkList是一个结构体类型,而不是指针类型,那么s=L 这样的语句就是彻底错误的,要知道void ListFree(LinkList L),这里的L是局部变量,进入函数时从堆栈中得到的,而不是你malloc出来的。所以你的free一定是失败的。追问

typedef struct LNode{
int x;
struct LNode *next;
}LNode,*LinkList;
其他部分写不下,已发你私信了

追答

两个malloc都改成malloc(sizeof(LNode));

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-26
1、如果是小程序,就算不释放一般没什么大后果,因为开内存比较小。因为这里的空间就是内存空间,如果不断申请的话,会占用大部分内存。如果不释放的话,就一直占用内存,使内存减小。直到关闭程序,内存才会释放。可以free函数释放内存。
2、free函数:
原型:void free(void *ptr);
功能:释放malloc(或calloc、realloc)函数给指针变量分配的动态内存;
头文件:malloc.h或stdlib.h;
3、为了避免释放已经释放了内存的指针内存,或没有释放内存,在C语言中最好是在定义指针时赋初值NULL,释放后立即赋NULL,释放时检查指针值再决定释放就避免释放错误了,例如:
int *a = NULL
int *b = (int*) malloc(sizeof(int) * 10);
a= b;
/* 执行大量操作后 */
if(a != NULL) {free(a);a=NULL;}
if(b != NULL) {free(b);b=NULL;}本回答被网友采纳
第2个回答  2013-11-29
LinkList 和 LNode* 是同一种类型吗,如果不是就会re,如果是也建议使用相同标识符追问

typedef struct LNode{
int x;
struct LNode *next;
}LNode,*LinkList;

相似回答