用free函数销毁链栈时,VC++出现Debug Assertion Failed!
本帖最后由 Ninaduu 于 2019-2-16 14:50 编辑学习数据结构和算法时,做到了用栈实现二进制转化十进制问题。参照小甲鱼的思路敲了代码,最后可以运行出结果,但是一旦调用destroy函数就会跳出Debug Assertion Failed! 问题,好气!!
回想了下,貌似在线性表那章,每次练习题用到free函数也会出现这个问题,但是当时没重视。
网上说可能是调用了野指针或是内存泄露,看得云里雾里也不知道该怎么解决呜呜呜{:5_99:}
下面是destroy函数和主函数代码。小菜鸟一枚,麻烦各位大佬了33
/* 销毁*/
static void DestroyStack (Sqstack *s)
{
int i, len;
ELemtype *p = s->base;
len = STACK_INIT_SIZE;
for ( i=0; i < len; i++)
{
p = s->base++;
free (s->base);
s->base = NULL;
}
s->base = s->top = NULL;
s->Stacksize = 0;
}
int main ()
{
Elemtype e;
Sqstack s;
int i, Len, sum = 0;
InitStack (&s);
printf ("输入二进制数,输入#表示结束:");
scanf ("%c", &e);
while ( e != '#' )
{
PushStack (&s, e);
scanf ("%c", &e);
}
getchar ();
Len = StackLen (s);
printf ("栈的当前容量为:%d\n", Len);
for( i=0; i < Len; i++ )
{
PopStack (&s, &e);
sum += (int) ((e - 48) * pow(2, i));
}
printf ("转化为二进制为:%d\n", sum);
DestroyStack (&s); /* 真让人头大 */
return 0;
}
你要给出完整可执行代码我运行看看 本帖最后由 jackz007 于 2019-2-16 16:24 编辑
s是一个变量,free(& s),必然会出错。
ptr = malloc(x);
free(ptr) ;
才不会出错。
感觉楼主的栈销毁在这里完全多余。 jackz007 发表于 2019-2-16 15:59
s是一个变量,free(& s),必然会出错。
ptr = malloc(x);
soga!所以free()内的指针必须是malloc返回的原本地址,一旦释放就将申请的栈空间全部释放,即使ptr++后依然指向申请的空间内,依然无法成功(局部)free。这样理解正确么? jackz007 发表于 2019-2-16 15:59
s是一个变量,free(& s),必然会出错。
ptr = malloc(x);
对应修改,解决问题了。谢谢你!{:10_298:} Krant5 发表于 2019-2-16 15:59
你要给出完整可执行代码我运行看看
刚刚已经解决啦~~ thx!! ;D Krant5 发表于 2019-2-16 15:59
你要给出完整可执行代码我运行看看
哥,我的也出现这个毛病,帮我看看呗?
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
void initStack(sqStack *s)
{
s->base = (ElemType*)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(!s->base)
exit(0);
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}
void Push(sqStack *s, ElemType e)
{
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType));
if(!s->base)exit(0);
s->top = s->base + s->stackSize;
s->stackSize += STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
ElemType Pop(sqStack *s)
{
if(s->top == s->base) return NULL;
return *--(s->top);
}
void ClearStack(sqStack *s)
{
s->top =s->base;
}
void DestroyStack(sqStack *s)
{
int i,len;
len = s->stackSize;
for(i=0;i<len;i++)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}
int StackLen(sqStack s)
{
return (s.top-s.base);
}
int main()
{
ElemType sum=0,a=1,i,len;
char e;
sqStack *s;
s = (sqStack*)malloc(sizeof(sqStack));
initStack(s);
scanf("%c",&e);
while(e!='#')
{
Push(s, (int)(e-48));
scanf("%c",&e);
}
getchar();
len = StackLen(*s);
printf("栈的当前容量是:%d\n",len);
for(i=0; i<len; i++)
{
a *= 2;
sum += Pop(s)*a/2;
}
printf("%d",sum);
DestroyStack(s);
free(s);
s=NULL;
return 0;
}
酱子鱼1108 发表于 2019-3-29 13:26
哥,我的也出现这个毛病,帮我看看呗?
int *base;
你直接free(base);就好了,不需要一个个释放
void DestroyStack(sqStack *s)
{
/*
int i,len;
len = s->stackSize;
for(i=0;i<len;i++)
{
free(s->base);
s->base++;
}
*/
free(s->base);
s->base = s->top = NULL;
s->stackSize = 0;
}
页:
[1]