2012-11-17 72 views
2

我在C鏈接列表遇到問題,我只做了這樣的數據結構在C + +。段錯誤與鏈接列表

GDB是給我一個

Program received signal SIGSEGV, Segmentation fault. 0x0804a23c in addArg (base=0x1, argument=0x804e410 "is") at myshell.c:42 42 while ((curr != NULL) && (curr->n != NULL))

我所熟悉的具有內存做分段錯誤,但我想我已經正確地分配內存。我究竟做錯了什麼?

addArg被稱爲addArg(currentCmd->args, lexeme);和currentCmd是指向的節點結構

struct lnode { 
char *x; 
struct lnode *n; 
}; 


struct node 
    { 
    char *command; 
    struct lnode *args; 
    int input; 
    int output; 
    int error; 
    char *in; 
    char *out; 
    char *err; 
    struct node *next; 
    struct node *prev; 
    }; 



void addArg(struct lnode *base, char *argument) 
{ 
struct lnode *curr = base; 

//this is line 42 
    while ((curr != NULL) && (curr->n != NULL)) 
    curr = curr->n; 

    curr -> n = malloc(sizeof(struct lnode)); 
    curr = curr->n; 
    curr->x = strdup(argument); 
    curr->n = NULL; 
} 




struct node* createNode(char *command_, int input_, int output_, int error_, char *in_, char *out_, char *err_, struct node *prev_) 
    { 
    struct node *n; 
    n = malloc(sizeof (struct node)); 
    n->command = strdup(command_); 
    n->prev = prev_; 
    n->next = NULL; 
    n->input = input_; 
    n->output = output_; 
    n->error = error_; 
    n->in = in_; 
    n->out = out_; 
    n->err = err_; 
    n->args=malloc(sizeof(struct lnode)); 

return n; 
    } 
+0

我改變了我對評論的回答,因爲它不可能是_this_問題的原因。 'while'''循環'curr'可能是'NULL',但是你試圖設置它的一個成員,這會在以後導致問題。確保你解決了這個問題,否則你很快就會回到這裏;-)(澄清:發送一個NULL指針作爲該函數的參數,你將得到一個很好的SIGSEGV信號:) – Jite

+0

這是我的理解curr指向通過指向節點結構體中'lnode args'成員的函數傳遞給函數的參數。 – fotg

+0

那麼如果你的'addArg'函數的'base'參數是'NULL',那麼你將會出現segfault。在這種情況下,問題很可能是John Kugelman所說的。 – Jite

回答

0

我通過將lnode *args轉換爲lnode args並對內存管理進行必要的更改來解決了此問題。

0

它看起來像currentCmd->args是一個無效的指針。也許是指向free()d內存。或者是一個未初始化的指針,或者是一個指向局域變量的指針(儘管後面兩個似乎並不是這種情況)。

或者,您可能已經意外覆蓋了程序中其他位置的超出界限的內存。指針問題並不總是處於故障點;有時候他們在更早的代碼中,甚至是不相關的代碼。

+0

我編輯了代碼來初始化節點struct中的args,在分配內存之後將其設置爲NULL,但它沒有解決問題。 – fotg

0

我可以從你的gdb輸出中看到,while ((curr != NULL) && (curr->n != NULL))的問題是如果curr == NULL,你仍然試圖訪問curr-> n來比較,所以你應該改變這個條件來只比較curr,並處理curr-> n只有當curr不爲null時,如果curr-> n == NULL,可能會破壞cicle。