在C结构和指针分割错误(Struct and Pointer Segmentation Error

2019-08-03 14:39发布

谁能帮助这个分割错误我不断收到。 这段代码很简单,但错误是如此很难搞清楚。

struct Link {
  int key;
  unsigned data: 2;
  struct Link *next;
  struct Link *previous;
};

struct Link* addInOrder(struct Link *, struct Link);

int main() {
  struct Link *head;
  struct Link data1;
  struct Link data2;
  struct Link data3;
  data1.key = 25;
  data1.data = 1;
  data1.next = NULL;
  data2.key = 50;
  data2.data = 0;
  data2.next = NULL;
  data3.key = 100;  
  data3.data = 2; 
  data3.next = NULL;
  head = NULL;
  head = addInOrder(head, data2);
}

struct Link* addInOrder(struct Link *srt, struct Link l) {
  if(!srt) {
    return &l;
  }

  struct Link *temp = srt;
  while(temp->next && l.key > temp->key)
    temp = temp->next;

  printf("here\n");

  if(l.key > temp->key) {
    printf(" 1\n");
    temp->next = &l;
    l.previous = temp;
  }
  else {
    printf(" 2\n");
    l.previous = temp->previous;
    l.next = temp;
    printf( "2.2\n");
    if(temp->previous) {
      //printf("%i\n",temp->previous->key);
      temp->previous->next = &l;
    }
    printf(" 2.3\n");
    temp->previous = &l;
  }
  return srt;
}

我一直在addInOrder收到错误在第一行()。 所有的编译器说的是分割错误。

编辑:另外,如果我加上的printf( “...”); if语句,并运行它的权利......不打印

Answer 1:

你传递的第二个参数addInOrder()的值( struct Link l )。 这就造成当你调用该函数的自变量的副本,并在addInOrder() l堆栈上存在。 那么你返回局部变量的地址,并在分配给head ,但是当函数退出,该变量超出范围和被释放。 所以,你要指定一个无效的地址head ,并因此导致segfault。



Answer 2:

的部分(和到处&l时)

if (!srt)
    return &l;

返回一个堆栈变量的地址。 你addInOrder功能也许应该有签名

struct Link* addInOrder(struct Link* srt, struct Link* l);


文章来源: Struct and Pointer Segmentation Error in C