段错误将节点添加到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 循环之后处理它。
在 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 循环之后处理它。