我编写了一个函数,它将值附加到由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;
}
答案 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;
}