0

我已经为 RPN 计算器编写了代码,它适用于基本运算符(+、*、/、^)以及浮点数和负数。它还计算表达式,如 (x^2 + x*4/-2) : 1 -> 5 :0.5(x 从 1 计算到 5,步长为 0.5)

我使用了一个字符堆栈。

现在,我想添加对 cos(x)、tan(x) 等函数的支持。为了达到这个目的,我需要构建一个char* 堆栈,在解析后存储诸如 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;
}
4

2 回答 2

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是这里的指针(伪装,因为你使用了指针类型定义)。第二行使它指向指向的地方*last,泄漏内存。您可能希望将 指向 的数据复制到 指向*last的空间中aux

*aux = **last;

但是你有另一个错误:

strcpy(caract,aux->operador);

你还没有caract指出任何地方。


您的代码中其他地方可能存在错误;到目前为止,我只注意到这些。由于所有指针类型定义,您的代码很难阅读。如果您摆脱指针类型定义,这将有所帮助。

我建议你不要一次写这么多代码;编写一个函数,然后彻底测试它,一旦你确定它正在工作,然后转到下一个函数。

于 2014-07-24T03:22:16.643 回答
0

改变...

*pila = malloc(sizeof(**pila));

至...

*pila = malloc(sizeof(tipo));
于 2014-07-24T03:06:21.143 回答