free()函数怎么会出错了
大哥们,帮小弟看看下面的程序好不,调试时候总是出错:
typedef struct snode
{
DATATYPE2 data;
struct snode *next;
}LINKSTACK;
LINKSTACK *popstack(LINKSTACK *top)
{
LINKSTACK *p;
if(top==NULL)
{
printf( "empty ");
return NULL;
}else
{
p=top;
top=top-> next;
free(p);
}
return top;
}
我在运行时候windows就会跳出对话诓说我的程序有问题,然后问是忽略还是终止还是继续,我好郁闷的我这个程序几乎是照教科书上面写的做的怎么就会出错了,而且我把free()函数去掉后就没有问题,请问我的free()函数调错了吗?求大哥帮忙
[解决办法]
从你贴出的代码来看,popstack没什么问题的。
也许你应该看看是如何调用popstack的。
[解决办法]
p 又不是new的,还调用free()干什么?
[解决办法]
LINKSTACK *popstack(LINKSTACK *top)
{
LINKSTACK *p;//modify LINKSTACK *p = new LINKSTACK;
if(top==NULL)
{
printf( "empty ");
return NULL;
}else
{
p=top;
top=top-> next;
free(p);
}
return top;
}
[解决办法]
top入之前是怎麽的
[解决办法]
LINKSTACK *s,*k,*j;
k = (LINKSTACK*)malloc(sizeof(LINKSTACK));
j = (LINKSTACK*)malloc(sizeof(LINKSTACK));
j-> data=7;
j-> next=NULL;
k-> data=6;
k-> next=j;
s=k;
s=popstack(s);
while(s!=NULL)
{
printf( "%d ",s-> data);
s=s-> next;
}
[解决办法]
你的S 又不是malloc分配来的
怎能用free 释放
[解决办法]
p 又不是new的,还调用free()干什么?
你的S 又不是malloc分配来的
怎能用free 释放
----------------------
楼主写的是类似链表的东西,malloc应该在push_back里
不过单看此程序好像没问题,都贴出来吧,运行死机?逻辑错误?
[解决办法]
xiaolh()说的是对的,你的链表是将两个栈上的结构链在一起,pop时free自然要出错.
要么在堆上创建你的链表
要么不free
[解决办法]
好象贴出来的没有什么错误!
不过你要注意,在生成LINKSTACK对象的时候必须把LINKSTACK::next
不然你的程序就会有可能错误
[解决办法]
贴出调用部分后错误就很明显了,LZ你这个链表是用栈空间创建的,
所谓栈空间,在程序中给局部变量所分配的空间是栈空间,就比如你main函数中的k和j,栈空间的内存是系统自动释放的,不需要人工去干预;
另外还有堆空间,堆是程序中给指针变量采用调用malloc函数来分配的空间,堆空间的内存是手工调用free函数来释放的;
LZ用free函数来超作栈空间的内存所以就报错了