链表故障 我在C中有链接列表的问题,我只做了C++中的数据结构,
Gdb给了我一个链表故障 我在C中有链接列表的问题,我只做了C++中的数据结构,,c,linked-list,segmentation-fault,C,Linked List,Segmentation Fault,Gdb给了我一个 程序接收信号SIGSEGV,分段故障。 myshell的addArg(base=0x1,argument=0x804e410“is”)中的0x0804a23c。c:42 42 while((curr!=NULL)和&(curr->n!=NULL)) 我熟悉与内存有关的分段错误,但是我认为我已经正确分配了内存。我做错了什么 addArg被称为addArg(currentCmd->args,lexeme)和currentCmd是指向节点结构的指针 struct lnode { c
程序接收信号SIGSEGV,分段故障。
myshell的addArg(base=0x1,argument=0x804e410“is”)中的0x0804a23c。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;
}
看起来
currentCmd->args
是无效指针。可能是指向free()
d内存的指针。或者是一个未初始化的指针,或者是一个指向超出范围的局部变量的指针(尽管后面两个似乎不是这种情况)
或者,您可能意外地覆盖了程序中其他地方的越界内存。指针问题并不总是处于故障点;有时它们在早期的代码中,甚至是不相关的代码。我通过将
lnode*args
转换为lnode args
并对内存管理进行必要的更改来解决这个问题。我从您的gdb输出中可以看到,while((curr!=NULL)和((curr->n!=NULL))的问题
是指如果curr==NULL,您仍然试图访问curr->n进行比较,因此您应该将该条件更改为仅比较curr,并且仅当curr不为NULL时处理curr->n,如果curr->n==NULL,可能会在中间中断循环。我更改了对注释的回答,因为这不可能是问题的原因。在while
之后,循环curr
可能为NULL
,但您试图设置它的一个成员,这将导致以后出现问题。一定要把它修好,否则你很快就会回来;-)(说明:向该函数发送一个空指针作为参数,您将得到一个很好的SIGSEGV信号:)据我所知,curr指向传递到函数中的参数,该参数指向节点结构中的“lnode args”成员。如果addArg
函数的base
参数为NULL
,则将执行segfault。在本例中,问题很可能是John Kugelman所说的。我编辑了代码,在节点结构中初始化args,在分配内存后将其初始化为NULL,但它没有解决问题。