2014-07-24 61 views
0

我已经为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

更改...

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

到...

*pila = malloc(sizeof(tipo)); 
+0

它没有工作,以及,我得到相同的“访问冲突”错误。 谢谢! – Audo

+0

你传给init的是什么?请出示声明。 – n3rd4n1

+0

int main() { (...) top op; 的init(&op); (...) } – Audo

0

这是(以两种不同的方式)的错误:

new1 = (elemento)malloc(sizeof(tipo)); 
strncpy(new1->operador, dato,j); 

strncpy做不会生成一个字符串(即它不会t放置一个空终止符),因为你指定了一个不够大的缓冲区大小。第三个参数是输出缓冲区大小,而不是输入长度。

此外,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点还没有在任何地方。


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

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

+0

还有更多的错误。刚注意到这个:'aux = malloc(...); aux = * last;'在弹出功能中。分配内存并立即失去对它的引用。 –

+0

@AustinMullins伟大的思想家都认为:) –

+0

感谢这两个!我已经完成了你指出的修改,并且在init()中仍然存在相同的错误,在行 '* pila = malloc(sizeof(** pila)); //' – Audo