终端中的链接列表分段错误,但不在调试器中

时间:2017-05-03 21:55:01

标签: c linked-list segmentation-fault singly-linked-list

我编写了一个函数,它将值附加到由val和next组成的链表的末尾。但是,我一直收到错误:Segmentation Fault 11:core dumped。但是,当我在gdb上运行时,我没有收到任何错误。有什么想法吗?

intlist* intlist_append(intlist* xs, int val) 
{
    intlist* new = (intlist*)malloc(sizeof(intlist*));
    new->val = val;
    new->next = NULL;
    intlist* ys = xs;
    while(ys->next) 
    {
        ys = ys->next;
    }
    ys->next = new;
    free(new);
    return xs;
}

1 个答案:

答案 0 :(得分:1)

这部分功能

    // ...
    intlist* ys = xs;
    while(ys->next) 
    {
        ys = ys->next;
    }
    ys->next = new;
    free(new);
    return xs;
}

错了。首先,xs可以等于NULL。在这种情况下,使用表达式ys->next会导致未定义的行为。

其次,你不应该释放节点new。否则该功能没有意义。

第三,可以改变存储在局部变量ys中的头部。但是xs的值不会更改。在这种情况下,函数返回变量xs的未更改值。

此功能的第一个陈述也是错误的

intlist* new = (intlist*)malloc(sizeof(intlist*));
                                       ^^^^^^^^

应该有

intlist* new = (intlist*)malloc(sizeof(intlist));
                                       ^^^^^^^

该功能可以通过以下方式定义

intlist * intlist_append( intlist *xs, int val ) 
{
    intlist *new_node = malloc( sizeof( intlist ) );

    if ( new_node != NULL )
    {
        new_node->val  = val;
        new_node->next = NULL;

        intlist **current = &xs;

        while ( *current ) current = &( *current )->next; 

        *current = new_node;
    }

    return xs;
}