访问冲突初始化结构

时间:2014-07-24 02:57:22

标签: c pointers initialization stack rpn

我已经完成了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;
}

2 个答案:

答案 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会有所帮助。

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