今天在编写一个程序来计算后缀表达式的值中,出现了一个debug error. 如下图所示。
这个大概意思是:检测到向堆内存边缘写入数据不正常。后面慢慢我才找到,原来是我分配内存的时候太小,写入的数据越界了,所以在内存free的时候才出现这个debug.
现在我把我的部分code贴出来,这个运行的时候就会出现以上错误,因为我在压入堆栈的时候只分配了data为一个char内存大小,而我真正压入的时候为int型。如果分配内存的时候大一点这个问题就解决了。大家可以测试一下,解决方法我是这样做的:
Stacks tmp = (Stacks)malloc(sizeof(Stacks)*4); //在压入堆栈的时候分配4倍大小的Stacks
/*function: 计算后缀羙表括达式;
**data:2015/5/13
**Author:lss
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define Error(str) sprintf("%s",str);
typedef struct Nodes{
int data;
struct Nodes * next;
}*Stacks;
Stacks CreateStack(){ //创建¨一个新的栈
Stacks S = (Stacks)malloc(sizeof(Stacks));
if (S ==NULL){
cout<<"out of space!"<<endl;
S->next = NULL;
return S;
}
int FullStack(Stacks S){
if (S->next ==NULL)
return 1;
else
return 0;
}
Stacks PushStack(Stacks S, int data){ //入栈
Stacks tmp = (Stacks)malloc(sizeof(Stacks));
tmp->data = data;
tmp->next = S->next;
S->next = tmp;
return S;
}
int PopStack(Stacks S){ //出栈记得判断是否为空
if (FullStack(S))
{
Error( "Full stack" );
}
else{
int Num;
Stacks tmp = S->next;
Num = tmp->data;
S->next = S->next->next;
free(tmp);
return Num;
}
}
int main(){
Stacks S = CreateStack();
int tmp1,tmp2;
char Arr[]="124*+3+4+";
int len = sizeof(Arr)/sizeof(char);
for (int i = 0; i<len; i++)
{
if (Arr[i]>'0' && Arr[i]<'9')
{
PushStack(S,Arr[i]-48);
}else{
switch(Arr[i]){
case '+':
tmp1 = PopStack(S);
tmp2 = PopStack(S);
tmp2 = tmp1+tmp2;
PushStack(S,tmp2);
break;
case '*':
tmp1 = PopStack(S);
tmp2 = PopStack(S);
tmp2 = tmp1*tmp2;
PushStack(S,tmp2);
break;
default:break;
}
}
}
cout<<"the answer="<<PopStack(S);
return 0;
}