2

我试图弄清楚为什么我的程序在调用 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 **/                                                                                                                                                                 
    }
4

6 回答 6

5

发生这种情况是因为l指针从未初始化。似乎您希望ll_fill初始化它,但您错了 - 它是按值传递的(通过复制读取),并且您lll_fill函数中分配的任何内容都不会为l声明的内部分配值main。要实现您想要的,请通过l指针传递(您将拥有指向指针的指针)。ll_fill或者,将其设为and do的返回值l = ll_fill(l, 10);。另外,给自己找一个调试器——它会对你有很大帮助。

于 2012-07-15T06:29:10.387 回答
1

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

解决方案 :

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

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

于 2012-07-15T08:15:50.270 回答
1

l您没有在main()函数中填充指向局部变量的指针。相反,您lll_fill()函数中填充参数。考虑ll_fill返回被分配的指针的值。

于 2012-07-15T06:29:28.640 回答
1

当你打电话时ll_fill(l, 10);——问问自己, 的价值是l什么?当然你在被调用的函数中创建了一个新对象——但是你怎么main()知道这个新对象呢?它仍然指向最初(随机)分配给您的局部变量的未初始化l内存。

尝试将 aNULL作为初始值分配给您的l

struct ll *l = NULL;
于 2012-07-15T06:33:24.463 回答
1

您只是对按值调用的概念感到困惑。您正在将指针按值传递给函数 ll-fill。但是 ll-fill 会制作自己的副本,无论它会做什么更改,它都不会对 main 函数的指针产生任何影响。因此,当您将其传递给 ll_print() 时,由于它没有初始化,因此打印该值只会给您带来分段错误。
使用调试器它会在这种情况下帮助你。

于 2012-07-15T06:45:28.273 回答
1

更改您的 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 :) **/                             
}
于 2012-07-15T10:43:48.393 回答