Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我能知道是什么导致了分割错误吗?_C_Segmentation Fault - Fatal编程技术网

C 我能知道是什么导致了分割错误吗?

C 我能知道是什么导致了分割错误吗?,c,segmentation-fault,C,Segmentation Fault,我想我已经在下面的代码中正确地实现了指针。但它会导致分割错误。有人能解释一下原因吗 struct list { int index; struct list *next; }; void add(struct list *l,int index) { struct list *temp=l; if(l==NULL) { temp=(struct list *)malloc(sizeof(struct list)); temp

我想我已经在下面的代码中正确地实现了指针。但它会导致分割错误。有人能解释一下原因吗

struct list
{
    int index;
    struct list *next;
};
void add(struct list *l,int index)
{
    struct list *temp=l;
    if(l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        l=temp;
    }
    else
    {
        while(temp->next!=NULL)
        temp=temp->next;
        struct list *nnode=(struct list *)malloc(sizeof(struct list));
        nnode->index=index;
        nnode->next=NULL;
        temp->next=nnode;
    }
}

main()
{
        struct list *l;
        l=NULL;
        int el;
        scanf("%d",&el);
        add(l,el);
        while(l->next!=NULL)    //It causes seg fault
        {
            printf(" %d ",l->index);
            l=l->next;
        }
}

如果只调用add一次,则此代码不应出错,但我假设您调用了其他函数并传递了仍然为
NULL的列表,您应该发送指向该列表指针的指针

void add(struct list **l,int index)
{
    if(*l==NULL) {
        *l=(struct list *) malloc(sizeof(struct list));
    }
}

否则,当add返回时,它仍然是
NULL
,因为您只初始化指针的一个副本,或者如果这造成混淆,您可以在
main()
中初始化列表,并避免在
add()

中初始化。如果只调用一次add,则此代码不应出错,但是我假设您调用其他函数并传递仍然为
NULL的列表,您应该发送指向列表指针的指针

void add(struct list **l,int index)
{
    if(*l==NULL) {
        *l=(struct list *) malloc(sizeof(struct list));
    }
}

否则,当add返回时,它仍然是
NULL
,因为您只初始化指针的一个副本,或者如果这使您感到困惑,您可以在
main()
中初始化列表,并避免在
add()

中初始化此代码不会执行您认为它会执行的操作:

void add(struct list *l,int index)
{
    struct list *temp=l;
    if(l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        l=temp;
    }
...
参数l不会更改,因为您只是将其作为指针传递,为了更改l指向的对象,您需要传递l的地址

void add(struct list **l,int index)
{
    struct list *temp;
    if(*l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        *l=temp;
    }
...

否则更改将不会超出功能范围。

此代码不会执行您认为的操作:

void add(struct list *l,int index)
{
    struct list *temp=l;
    if(l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        l=temp;
    }
...
参数l不会更改,因为您只是将其作为指针传递,为了更改l指向的对象,您需要传递l的地址

void add(struct list **l,int index)
{
    struct list *temp;
    if(*l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        *l=temp;
    }
...


否则更改将不会超出功能范围。

代码中的缩进发生了什么?还有,什么是
el
?@cnicutar是的!这只是整个代码的一部分。发布部分是可以的,但是如果它是一个独立的程序,并且您询问运行时错误,请确保您发布的内容实际上是先编译的。另外,请确保您发布的代码确实说明了您遇到的问题。您的代码在编译后不会出错。谢谢,您的代码现在演示了您所问的问题。代码中的缩进发生了什么?还有,什么是
el
?@cnicutar是的!这只是整个代码的一部分。发布部分是可以的,但是如果它是一个独立的程序,并且您询问运行时错误,请确保您发布的内容实际上是先编译的。另外,请确保您发布的代码确实说明了您遇到的问题。您的代码在编译后不会出错。谢谢,您的代码现在演示了您正在询问的问题。使用单个级别指针,是什么导致它出错?即使现在,它也应该使用地址并将其值从NULL更改为NULL。否?@vivek_jonam否发送并初始化指针的副本,main中的指针仍然是“struct list*temp=l”中的
NULL
;我理解的是,l的地址被发送到temp,因为l是指针。是不是错了?在“结构列表*temp=l”中,这里l的值即结构的地址被发送到temp。它错了吗?@vivek_jonam是的,有点,但是
l
NULL
所以temp是
NULL
,然后你为本地指针
l
分配内存,而不是使用
main()
中的一个单级指针,这是怎么回事?即使现在,它也应该使用地址并将其值从NULL更改为NULL。否?@vivek_jonam否发送并初始化指针的副本,main中的指针仍然是“struct list*temp=l”中的
NULL
;我理解的是,l的地址被发送到temp,因为l是指针。是不是错了?在“结构列表*temp=l”中,这里l的值即结构的地址被发送到temp。它错了吗?@vivek_jonam是的,有点,但是
l
NULL
所以temp是
NULL
,然后你为本地指针
l
分配内存,并使用它,但不使用
main()
中的指针,但有问题的是,l被声明为指针,它的地址被发送到add。这应该与地址相符。否?想象一下,如果您编写一个函数foo(inta),并将a设置为函数中的一个值,那么在您离开函数时,a不会发生更改。如果你写foo(int*a),你可以改变a所指向的值,但不能改变它所指向的值,这需要另一个间接层次,这是可以的。。但在“struct list*temp=l”中,l的值即struct的地址被发送到temp。它错了吗?temp将被设置为指向l指向的同一个对象,但您想要实现的是更改l指向的对象,即新分配的结构。但有疑问的是,l被声明为指针,其地址被发送到add。这应该与地址相符。否?想象一下,如果您编写一个函数foo(inta),并将a设置为函数中的一个值,那么在您离开函数时,a不会发生更改。如果你写foo(int*a),你可以改变a所指向的值,但不能改变它所指向的值,这需要另一个间接层次,这是可以的。。但在“struct list*temp=l”中,l的值即struct的地址被发送到temp。错误吗?temp将被设置为指向l指向的同一个对象,但您想要实现的是更改l指向的对象,即新分配的结构。