写堆栈的时候报的奇怪的错。
还是在destory的时候报的错,报错信息如下:
发现问题:
Windows 已在 SqStack.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 SqStack.exe 中或它所加载的任何 DLL 中有 Bug。
原因也可能是用户在 SqStack.exe 具有焦点时按下了 F12。
输出窗口可能提供了更多诊断信息。
----------------------------------
确实百思不得其解,心想:堆怎么被我破坏了,什么时候破坏的呢,哎!没办法,只能一行一行看。
结果发现:
realloc的时候破坏了堆的结构,将指针移到了堆区的上面了,所以destroy的时候报错了。
错误的代码块是:
Status push(SqStack *s,ElemType e){ if(s->top-s->base == STACK_INIT_SIZE){ s->base = (ElemType*)realloc(s->base,(s->stacksize+STACK_INCREMENT)*sizeof(ElemType)); if(!s->base){ exit(OVERFLOW); } s->top = s->base + s->stacksize; s->stacksize+=STACK_INCREMENT; } *s->top++ = e; return OK; }
错误的地方就是:if(s->top-s->base == STACK_INIT_SIZE){了,只要超过了初始的栈大小,就会错。
出错的地方还是使用堆以外的内存。在free的时候,由于这些内存不是malloc管理的,所以free就报错了。