malloc和realloc函数总是报错

从蓝田到元谋 2007-04-30 09:15:03
//用栈来实现表达式的求值
#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函数出问题,不知道是什么会事,把乱七八糟的头文件加进去了之后,问题依旧,希望高手能帮我看一下,不胜感激!
...全文
300 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
laiwusheng 2007-04-30
  • 打赏
  • 举报
回复
//栈要怎么初始化呢
////////////////////////////////////////////////////////////////////
//声明为引用就可以不用初始化了
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=' ';
从蓝田到元谋 2007-04-30
  • 打赏
  • 举报
回复
对,问题的来源是#define后面多加了;郁闷中...
但是栈要怎么初始化呢
  • 打赏
  • 举报
回复
你还有其他很多为初始化错误
  • 打赏
  • 举报
回复
#define STACK_INIT_SIZE 100; //栈的最大长度
#define STACKINCREMENT 10; //栈的长度的增量

#define语句后面不能加分号

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧