编写计算后缀表达式的值时出现内存方面的debug error.

今天在编写一个程序来计算后缀表达式的值中,出现了一个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;

}

 

你可能感兴趣的:(编写计算后缀表达式的值时出现内存方面的debug error.)