链表故障 我在C中有链接列表的问题,我只做了C++中的数据结构,

链表故障 我在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

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 {
 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,但它没有解决问题。