繁体   English   中英

链表 - C - 分段错误

[英]Linked list - C - segmentation fault

我试图弄清楚为什么我的程序在调用ll_print时崩溃了。 [[这是一个非常简单直接的问题,我不确定要添加什么来填补解释空白]]

    struct ll{
          struct ll* next;
          int n;
        } ll;

   void ll_print(struct ll *l){
      while (l) {
        printf("%d ", l->n);
        l=l->next;
      }
    }

    void ll_fill(struct ll *l, int n){
      struct ll *temp= NULL;
       while (n>0){
        l= (struct ll*)malloc(sizeof(struct ll));
        l->n=n;
        l->next= temp;
        temp=l;
        n--;
      }
     }

    int main(void){
      int i=0;
      struct ll *l;                                                                                                                                          
      ll_fill(l, 10);
      ll_print(l);  /** causing a segmntation fault **/                                                                                                                                                                 
    }

这是因为l指针永远不会被初始化。 看来你希望ll_fill初始化它,但是你错了 - 它是通过值传递的(read-by copy),而你在ll_fill函数中分配给l任何东西都没有为在main声明的l赋值。 要实现你想要的,通过指针传递l (你将有指向指针的指针)。 或者,将其ll_fill的返回值,并执行l = ll_fill(l, 10); 另外,给自己一个调试器 - 它会帮助你很多。

您没有在main()函数中填充指向局部变量l的指针。 而是在ll_fill()函数中ll_fill() l的参数。 考虑让ll_fill返回ll_fill指针的值。

当你调用ll_fill(l, 10); - 问问自己, l的价值是多少? 当然你在被调用函数中创建了一个新对象 - 但你的main()如何知道这个新对象? 它仍然指向最初(随机)分配给您的本地变量l未初始化的内存。

尝试将NULL作为初始值分配给l

struct ll *l = NULL;

你只是在调用byy值的概念中感到困惑。 您正在通过值传递指针到函数ll-fill。 但ll-fill将自己制作副本,无论它做什么改变,它都不会对main函数的指针产生任何影响。 因此,当您将其传递给ll_print()时,因为它未初始化,因此打印该值只会给您分段错误。
使用调试器它将帮助您始终处于这种状态。

由于要为函数内部的指针l分配内存,因此需要传递指针的地址而不是传递指针变量。 虽然指针l在函数ll_fill初始化,但是当它从函数中出来时,作用域会死掉,并且ll_print(l)会抛出段错误,因为它找不到指针l的地址。

方案:

  1. 如果想要在函数内初始化,则传递指针的地址。

  2. 如果指针由多个指针共享,那么在这两个函数的公共范围内声明(即在main()初始化main()总是好的。

更改ll_fill函数定义并调用如下:

void ll_fill(struct ll **l, int n){
  struct ll *temp= NULL;
  while (n>0){
    *l= (struct ll*)malloc(sizeof(struct ll));
    (*l)->n=n;
    (*l)->next= temp;
    temp=(*l);
    n--;
  }
}

int main(void){
  int i=0;
  struct ll *l;                                                                 
  ll_fill(&l, 10);
  ll_print(l);  /** now no segmntation fault :) **/                             
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM