读书人

malloc和realloc函数总是报错,该如何解

发布时间: 2012-02-22 19:36:55 作者: rapoo

malloc和realloc函数总是报错
//用栈来实现表达式的求值
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <process.h> // exit()
#include <float.h>

#define STACK_INIT_SIZE 100; //栈的最大长度
#define STACKINCREMENT 10; //栈的长度的增量

typedef struct //定义float数字栈类型
{
float *base;
float *top;
int stacksize;
}SqStack_float;


typedef struct //定义char字符栈类型
{
char *base;
char *top;
int stacksize;
}SqStack_char;

char ch[7]={ '+ ', '- ', '* ', '/ ', '( ', ') ', '# '}; //两个全局数组
char Array[7][7]=
{ { '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
{ '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
{ '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
{ '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
{ ' < ', ' < ', ' < ', ' < ', ' < ', '= ', '@ '},
{ '> ', '> ', '> ', '> ', '@ ', '> ', '> '},
{ ' < ', ' < ', ' < ', ' < ', ' < ', '@ ', '= '} };


//函数声明
void InitStack(SqStack_float S); //初始化一个数字栈
void InitStack(SqStack_char S); //初始化一个字符栈
void Push(SqStack_float S,float e); //将数字e进栈
void Push(SqStack_char S,char e); //将字符e进栈
void Pop(SqStack_float S,float e); //数字e出栈
void Pop(SqStack_char S,char e); //字符e出栈
float GetTop(SqStack_float S); //返回数字栈栈顶元素
char GetTop(SqStack_char S); //返回字符栈栈顶元素


bool In(char e); //判断字符e是否属于字符集合
char Precede(char e,char c); //比较两个字符的优先级,并返回
float Operate(float a,char e,float b); //将a和b进行e字符代表的运算,并返回


float main()
{

SqStack_char OPTR; SqStack_float OPND;//分别定义字符栈和数字栈
char c,x,theta;
float a,b,e;
int i;
InitStack(OPTR); Push(OPTR, '# ');
InitStack(OPND);

char expr[80];
gets(expr);
c=expr[0]; i=0;
//c=getchar();
while(c!= '# '||GetTop(OPTR)!= '# ')
{

if(!In(c))
{
e=(float)c; Push(OPND,e);
i++; c=expr[i];
}
else
{
switch(Precede(GetTop(OPTR),c))
{
case ' < ':
Push(OPTR,c); i++; c=expr[i];
break;
case '= ':
Pop(OPTR,x); i++; c=expr[i];
break;
case '> ':
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
}



void InitStack(SqStack_float S) //初始化一个数字栈
{
S.base=(float*)malloc(STACK_INIT_SIZE*sizeof(float));
//if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void InitStack(SqStack_char S) //初始化一个数字栈
{
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
//if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}


void Push(SqStack_char S,char e) //在字符栈中字符e进栈
{
if(S.top-S.base> =S.stacksize)
{
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
//if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}
void Push(SqStack_float S,char e) //在数字栈中数字e进栈
{
if(S.top-S.base> =S.stacksize)
{
S.base=(float*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(float));
//if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}


void Pop(SqStack_char S,char e) //在字符栈中字符e出栈
{
if(S.top==S.base) cout < < "空栈不能删除! " < <endl;
else e=*--S.top;
}
void Pop(SqStack_float S,float e) //在数字栈中数字e出栈
{
if(S.top==S.base) cout < < "空栈不能删除! " < <endl;


else e=*--S.top;
}


char GetTop(SqStack_char S) //返回字符栈栈顶元素
{
//if(S.top==S.base)
char e=*(S.top-1);
return e;
}
float GetTop(SqStack_float S) //返回数字栈栈顶元素
{
//if(S.top==S.base)
float e=*(S.top-1);
return e;
}


bool In(char e) //判断字符e是否属于字符集合
{

for(int i=0;i <7;i++)
{
if(e==ch[i]) return true;
}
return false;
}


char Precede(char e,char c) //比较两个字符的优先级
{
int i,j,k;

for(k=0;k <7;k++)
{
if(e==ch[k]) i=k;
if(c==ch[k]) j=k;
}
return Array[i][j];
}


float Operate(float a,char e,float b) //运算并返回结果
{ float value;
switch(e)
{
case '+ ':
value=a+b; break;
case '- ':
value=a-b; break;
case '* ':
value=a*b; break;
case '/ ':
value=a/b; break;
default: break;
}
return value;
}


程序编译时总是这两个malloc和realloc函数出问题,不知道是什么会事,把乱七八糟的头文件加进去了之后,问题依旧,希望高手能帮我看一下,不胜感激!

[解决办法]
#define STACK_INIT_SIZE 100; //栈的最大长度
#define STACKINCREMENT 10; //栈的长度的增量

#define语句后面不能加分号
[解决办法]
//栈要怎么初始化呢
////////////////////////////////////////////////////////////////////
//声明为引用就可以不用初始化了
void InitStack(SqStack_float& S); //初始化一个数字栈
void InitStack(SqStack_char& S); //初始化一个字符栈
void Push(SqStack_float& S,float e); //将数字e进栈
void Push(SqStack_char& S,char e); //将字符e进栈
void Pop(SqStack_float& S,float e); //数字e出栈
void Pop(SqStack_char& S,char e); //字符e出栈
float GetTop(SqStack_float& S); //返回数字栈栈顶元素
char GetTop(SqStack_char& S); //返回字符栈栈顶元素
字符变量作实参需初始化
char c,x= ' ',theta= ' ';

读书人网 >C语言

热点推荐