鱼C论坛

 找回密码
 立即注册
查看: 3511|回复: 7

用free函数销毁链栈时,VC++出现Debug Assertion Failed!

[复制链接]
发表于 2019-2-16 14:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Ninaduu 于 2019-2-16 14:50 编辑

学习数据结构和算法时,做到了用栈实现二进制转化十进制问题。参照小甲鱼的思路敲了代码,最后可以运行出结果,但是一旦调用destroy函数就会跳出Debug Assertion Failed! 问题,好气!!
回想了下,貌似在线性表那章,每次练习题用到free函数也会出现这个问题,但是当时没重视。
网上说可能是调用了野指针或是内存泄露,看得云里雾里也不知道该怎么解决呜呜呜
下面是destroy函数和主函数代码。小菜鸟一枚,麻烦各位大佬了33

  1. /* 销毁*/
  2. static void DestroyStack (Sqstack *s)
  3. {
  4.         int i, len;
  5.         ELemtype *p = s->base;
  6.         len = STACK_INIT_SIZE;
  7.         for ( i=0; i < len; i++)
  8.         {
  9.                 p = s->base++;
  10.                 free (s->base);
  11.                 s->base = NULL;
  12.         }
  13.         s->base = s->top = NULL;
  14.         s->Stacksize = 0;
  15. }

  16. int main ()
  17. {
  18.         Elemtype e;
  19.         Sqstack s;
  20.         int i, Len, sum = 0;
  21.         InitStack (&s);
  22.         printf ("输入二进制数,输入#表示结束:");
  23.         scanf ("%c", &e);
  24.         while ( e != '#' )
  25.         {
  26.                 PushStack (&s, e);
  27.                 scanf ("%c", &e);
  28.         }
  29.         getchar ();
  30.         Len = StackLen (s);
  31.         printf ("栈的当前容量为:%d\n", Len);
  32.         for( i=0; i < Len; i++ )
  33.         {
  34.                 PopStack (&s, &e);
  35.                 sum += (int) ((e - 48) * pow(2, i));
  36.         }
  37.         printf ("转化为二进制为:%d\n", sum);
  38.         DestroyStack (&s);              /* 真让人头大 */
  39.         return 0;
  40. }
复制代码


微信截图_20190216144536.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-2-16 15:59:01 | 显示全部楼层
你要给出完整可执行代码我运行看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-16 15:59:09 | 显示全部楼层
本帖最后由 jackz007 于 2019-2-16 16:24 编辑

       s  是一个变量,free(& s),必然会出错。

       ptr = malloc(x)  ;
       free(ptr)            ;

       才不会出错。

       感觉楼主的栈销毁在这里完全多余。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 21:23:53 | 显示全部楼层
jackz007 发表于 2019-2-16 15:59
s  是一个变量,free(& s),必然会出错。

       ptr = malloc(x)  ;

soga!所以free()内的指针必须是malloc返回的原本地址,一旦释放就将申请的栈空间全部释放,即使ptr++后依然指向申请的空间内,依然无法成功(局部)free。这样理解正确么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 21:25:51 | 显示全部楼层
jackz007 发表于 2019-2-16 15:59
s  是一个变量,free(& s),必然会出错。

       ptr = malloc(x)  ;

对应修改,解决问题了。谢谢你!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-16 21:26:49 | 显示全部楼层
Krant5 发表于 2019-2-16 15:59
你要给出完整可执行代码我运行看看

刚刚已经解决啦~~ thx!! ;D
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-29 13:26:52 | 显示全部楼层
Krant5 发表于 2019-2-16 15:59
你要给出完整可执行代码我运行看看

哥,我的也出现这个毛病,帮我看看呗?
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define STACK_INIT_SIZE 100
  4. #define STACKINCREMENT 10


  5. typedef int ElemType;

  6. typedef struct
  7. {
  8.         ElemType *base;
  9.         ElemType *top;
  10.         int stackSize;
  11. }sqStack;

  12. void initStack(sqStack *s)
  13. {
  14.         s->base = (ElemType*)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
  15.         if(!s->base)
  16.                 exit(0);
  17.         s->top = s->base;
  18.         s->stackSize = STACK_INIT_SIZE;
  19. }

  20. void Push(sqStack *s, ElemType e)
  21. {
  22.         if(s->top - s->base >= s->stackSize)
  23.         {
  24.                 s->base = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType));
  25.                 if(!s->base)  exit(0);

  26.                 s->top = s->base + s->stackSize;
  27.                 s->stackSize += STACKINCREMENT;
  28.         }
  29.         *(s->top) = e;
  30.         s->top++;
  31. }


  32. ElemType Pop(sqStack *s)
  33. {
  34.         if(s->top == s->base) return NULL;
  35.         return *--(s->top);
  36. }

  37. void ClearStack(sqStack *s)
  38. {
  39.         s->top =s->base;
  40. }

  41. void DestroyStack(sqStack *s)
  42. {
  43.         int i,len;
  44.         len = s->stackSize;
  45.         for(i=0;i<len;i++)
  46.         {
  47.                 free(s->base);
  48.                 s->base++;
  49.         }
  50.         s->base = s->top = NULL;
  51.         s->stackSize = 0;
  52. }

  53. int StackLen(sqStack s)
  54. {
  55.         return (s.top-s.base);
  56. }


  57. int main()
  58. {
  59.         ElemType sum=0,a=1,i,len;
  60.         char e;
  61.         sqStack *s;
  62.         s = (sqStack*)malloc(sizeof(sqStack));
  63.         initStack(s);
  64.         scanf("%c",&e);
  65.         while(e!='#')
  66.         {
  67.                 Push(s, (int)(e-48));
  68.                 scanf("%c",&e);
  69.         }
  70.         getchar();
  71.         len = StackLen(*s);
  72.         printf("栈的当前容量是:%d\n",len);
  73.         for(i=0; i<len; i++)
  74.         {
  75.                 a *= 2;
  76.                 sum += Pop(s)*a/2;
  77.         }
  78.         printf("%d",sum);
  79.         DestroyStack(s);
  80.         free(s);
  81.         s=NULL;
  82.         return 0;
  83. }






复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-1 19:26:31 | 显示全部楼层
酱子鱼1108 发表于 2019-3-29 13:26
哥,我的也出现这个毛病,帮我看看呗?

int *base;
你直接free(base);就好了,不需要一个个释放
  1. void DestroyStack(sqStack *s)
  2. {
  3. /*
  4.         int i,len;
  5.         len = s->stackSize;
  6.         for(i=0;i<len;i++)
  7.         {
  8.                 free(s->base);
  9.                 s->base++;
  10.         }
  11.         */
  12.         free(s->base);
  13.         s->base = s->top = NULL;
  14.         s->stackSize = 0;
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 01:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表