我已经完成了RPN计算器的代码,它适用于基本运算符(+,*,/,^)以及浮点数和负数。它还评估像这样的表达式 (x ^ 2 + x * 4 / -2):1 - > 5:0.5(x评价为1至5,步长为0.5)
我使用了 char堆栈。
现在,我想添加对cos(x),tan(x)等函数的支持。为了达到这个目的,我需要构建一个 char * stack ,在解析后存储sin,cos,sqrt等单词。
问题是,在初始化堆栈时,我收到“访问冲突:写入地址0x01 ”错误。
我不确切知道为什么。可以使用malloc()吗?
这些是使用堆栈的功能。
typedef struct nodo{
char *operador;
struct nodo *next;
}tipo;
typedef tipo *elemento;
typedef tipo *top;
int push(top*,char*) ;
void init(top *);
void libera(top*);
char* pop(top*);
int main(){
(...)
top op;
init(&op);
(...)
}
void init(top *pila) {
*pila = malloc(sizeof(**pila));
(*pila)->operador = NULL;
(*pila)->next = NULL;
}
void libera(top *pila) {
free(*pila);
*pila = NULL;
}
int push (top *last,char *dato){
elemento new1;
int j=strlen(dato);
new1 = (elemento)malloc(sizeof(tipo));
strncpy(new1->operador, dato,j);
new1->next=*last;
*last=new1;
;}
char* pop(top *last){
elemento aux;
char* caract;
aux = (elemento)malloc(sizeof(tipo));
aux=*last;
if (!aux)
return 0;
*last=aux->next;
strcpy(caract,aux->operador);
free(aux);
return caract;
}
答案 0 :(得分:0)
更改...
*pila = malloc(sizeof(**pila));
为...
*pila = malloc(sizeof(tipo));
答案 1 :(得分:0)
这是一个错误(以两种不同的方式):
new1 = (elemento)malloc(sizeof(tipo));
strncpy(new1->operador, dato,j);
strncpy
不会生成字符串(即它不会放置空终止符),因为您指定的缓冲区大小不够大。第三个参数是输出缓冲区大小,而不是输入长度。
此外,new1->operador
是未初始化的指针。你没有为它提供任何空间。
要解决这个问题,或许可以这样做:
init(&new1);
new1->operador = malloc( strlen(dato) + 1 );
strcpy(new1->operador, dato);
这是另一个错误:
aux = (elemento)malloc(sizeof(tipo));
aux=*last;
aux
是一个指针(因为你使用了指针typedef而伪装)。第二行使它指向*last
指向的位置,泄漏内存。您可能希望将*last
指向的数据复制到aux
指向的空间中:
*aux = **last;
但是你还有另一个错误:
strcpy(caract,aux->operador);
你还没有指出caract
点。
您的代码中可能存在其他错误;到目前为止我刚注意到这些。由于所有指针typedef,您的代码很难读取。如果你摆脱指针typedef会有所帮助。
我建议你不要一次写这么多代码;写一个函数,然后一旦你确定它正在工作就彻底测试它,然后转到下一个函数。