首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-22 
malloc和realloc函数总是报错//用栈来实现表达式的求值#include iostream.h#include string.h#include

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= ' ';

热点排行