带有链表的段错误

时间:2012-11-17 21:18:59

标签: c linked-list segmentation-fault

我在使用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的指针

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;
  }

3 个答案:

答案 0 :(得分:0)

看起来currentCmd->args是无效指针。也许是指向free()内存的指针。或者是一个未初始化的指针,或指向超出范围的局部变量的指针(虽然后两者似乎不是这种情况)。

或者你可能在程序的其他地方意外地覆盖了越界内存。指针问题并不总是处于失败的程度;有时他们会使用早期的代码,甚至不相关的代码。

答案 1 :(得分:0)

我通过将lnode *args转换为lnode args并对内存管理进行必要的更改来解决此问题。

答案 2 :(得分:0)

我从gdb输出中可以看到,while ( (curr != NULL) && (curr->n != NULL) )的问题是,如果curr == NULL,你仍然试图访问curr-> n进行比较,所以你应该改变那个条件只比较curr,并且仅当curr不为null时才处理curr-> n,如果curr-> n == NULL,可能会破坏cicle。