[英]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
的地址。
方案:
如果想要在函数内初始化,则传递指针的地址。
如果指针由多个指针共享,那么在这两个函数的公共范围内声明(即在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.