我在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;
}
我改變了我對評論的回答,因爲它不可能是_this_問題的原因。 'while'''循環'curr'可能是'NULL',但是你試圖設置它的一個成員,這會在以後導致問題。確保你解決了這個問題,否則你很快就會回到這裏;-)(澄清:發送一個NULL指針作爲該函數的參數,你將得到一個很好的SIGSEGV信號:) – Jite
這是我的理解curr指向通過指向節點結構體中'lnode args'成員的函數傳遞給函數的參數。 – fotg
那麼如果你的'addArg'函數的'base'參數是'NULL',那麼你將會出現segfault。在這種情況下,問題很可能是John Kugelman所說的。 – Jite