段错误将节点添加到c中的链表

Seg fault adding a node to linked list in c

在 leetcode Add-Two-nums 中,我尝试遍历两个链表,在第一个示例中,我创建了一个指向已分配节点的中间指针,然后将其添加到原始节点,在第二个示例中,我尝试摆脱这个 ptr 变量并直接添加节点,但是在我自己的机器上编译时,两个示例在 leetcode 中继续出现堆栈缓冲区溢出,并且在第二个示例中只有一个段错误,第一个示例工作正常

ListNode * addTwoNums(ListNode *l1, ListNode *l2)
{
    ListNode *result;
    ListNode *tmp = result;
    int carry =0;
    int sum =0;

    while ( l1->next != NULL && l2->next != NULL)
    {
        sum = l1->val+l2->val+carry ; 
        printf("%d + %d = %d\n", l1->val, l2->val, l1->val+l2->val);
        if ( sum > 9)
        {
            result->val = 0;
            carry = 1;
        } 
        else
        {
            result->val = sum;
            carry = 0;
        }
        ListNode *ptr = (ListNode *)malloc(sizeof(ListNode)); 
        result->next = ptr;
        l1 = l1->next;
        l2 = l2->next;
        result = result->next;
    } 
}

在此示例中,我删除了指针 ptr 并尝试将分配的节点直接添加到下一个值,但出现了段错误

ListNode * addTwoNums(ListNode *l1, ListNode *l2)
{
    ListNode *result;
    ListNode *tmp = result;
    int carry =0;
    int sum =0;

    while ( l1->next != NULL && l2->next != NULL)
    {
        sum = l1->val+l2->val+carry ; 
        printf("%d + %d = %d\n", l1->val, l2->val, l1->val+l2->val);
        if ( sum > 9)
        {
            result->val = 0;
            carry = 1;
        } 
        else
        {
            result->val = sum;
            carry = 0;
        }
        result->next = (ListNode *)malloc(sizeof(ListNode)); 
        l1 = l1->next;
        l2 = l2->next;
        result = result->next;
    } 
}

对于初学者来说,这个 while 循环

while ( l1->next != NULL && l2->next != NULL)

如果至少有一个传递的列表为空,则可以调用未定义的行为。

指针结果未初始化

ListNode *result;

所以至少这个声明

result->val = 0;

还会调用未定义的行为。

并且将数据成员 val 设置为 0 在任何情况下都没有意义。

注意while循环后传递的指针之一可以是non-null指针。您还需要在 while 循环之后处理它。