c - C 中的结构和指针段错误

标签 c pointers struct segmentation-fault

任何人都可以帮助我解决这个分割错误吗?这段代码很简单,但错误很难弄清楚。

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() 的第一行收到错误。编译器说的只是段错误。

编辑:另外,如果我在 if 语句之后添加 printf("..."); 并运行它...不打印

最佳答案

您正在按值 (struct Link l) 传递 addInOrder() 的第二个参数。这会在您调用该函数时创建参数的副本,并且在 addInOrder() 中,l 存在于堆栈中。然后您将返回局部变量的地址并将其分配给 head,但是当函数退出时,该变量超出范围并被释放。因此,您为 head 分配了一个无效地址,这会导致段错误。

关于c - C 中的结构和指针段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735701/

相关文章:

c - 使用 C 将二进制文件读入结构体,处理 char [8]

arrays - 为什么我不能在 Swift 中使用数组的 append()?

c - 静默安装 winpcap

c - 如何在 C 中从 stdin 进行非阻塞输入

c - vstudio 中的 argc 和 argv - 到上部回声

c++ - 无法在 Linux 上使用 C++ 保存文本文件

c++ - 方法返回模板类 C++

C++ 传递指针引用

c - gnuc 中的可变长度结构

c - 在 C 中使用 While 循环强制用户输入整数