2014-07-24 97 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