在运行代码时,我遇到了地址清理器错误

时间:2019-07-04 13:49:32

标签: c data-structures linked-list

这是LeetCode中的一个问题,我基本上必须使用链接列表添加两个数字。我对自己所做的事情非常有信心,并且我的代码被接受了他们的默认测试用例。但是,当我点击“提交”时,它不适用于他们的任何测试用例。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
 struct ListNode *temp1= l1,*temp2=l2,*temp3=(struct ListNode*)malloc(sizeof(struct ListNode)),*temp4=temp3,*prev;
    temp3->val=0;
 long long int num1=0,num2=0;
 while (temp1!=NULL)
 {
     num1=num1*(long long int )10 + (long long int )temp1->val;
    temp1 = temp1->next;
 }
 while (temp2!=NULL)
 {
     num2=num2*10 + temp2->val;
     temp2 = temp2->next;
 }
 long long int  num3 = num1+num2;
 do
 {

     temp3->val = (long long int )num3%10;
     temp3->next =  (struct ListNode*)malloc(sizeof(struct ListNode));
     prev=temp3;
     temp3 = temp3->next;
     num3/=(long long int )10;
 } while(num3!=0);
  prev->next=NULL;
  return temp4;
}


我采用了蛮力方法,只是将两个数字相加。它给了我正确的价值。然后,我创建一个新的链表,在其中保存everu 数字并为补偿最后的多余元素,我分别保存了前一个节点。 最后,我删除了最后一个元素与多余元素的连接。我运行我的代码,并获得正确的输出。 我期望[7,0,8]并得到[7,0,8]

这是回溯:

AddressSanitizer: SEGV on unknown address 0x0000000c7616 (pc 0x0000004019db bp 0x7ffff1366900 sp 0x7ffff13668e0 T0)

关于错误,实际上没有什么地方。这是我能找到的最相似的东西,但是无论如何我一直在使用malloc分配内存,并且使用free(prev-> next)弄乱了所有东西。 link

我也想澄清一下,我并不是在寻找理想的答案,因为我不想作弊,只是找出我在做错什么。

编辑

添加do-while循环使我清楚了1563年之后的另外14个测试用例... 出现新错误

Line 17: Char 15: runtime error: signed integer overflow: 399999999 * 10 cannot be represented in type 'int' (solution.c)

第17行是num1 = num1 * 10 + temp1-> val行;我决定将每个int替换为long long int,但是除了清除五个额外的测试用例外,其他没有什么区别。 (我将每个值都强制转换为包含常量的long int类型)

1 个答案:

答案 0 :(得分:3)

prevnum3时,我做了一些更改以不取消引用0指针。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
 struct ListNode *temp1= l1,*temp2=l2,*temp3=(struct ListNode*)malloc(sizeof(struct ListNode)),*temp4=temp3;
    temp3->val=0;
    temp3->next=NULL;

 int num1=0,num2=0;
 while (temp1!=NULL)
 {
     num1=num1*10 + temp1->val;
    temp1 = temp1->next;
 }

 while (temp2!=NULL)
 {
     num2=num2*10 + temp2->val;
     temp2 = temp2->next;
 }

 int num3 = num1+num2;
 while(num3!=0)
 {
     temp3->val = num3%10;
     temp3->next =  (struct ListNode*)malloc(sizeof(struct ListNode));
     temp3->next->next = NULL;
     temp3 = temp3->next;
     num3/=10;
 }

  return temp4;
}

基本上,我删除了prev变量,而不是直接分配NULL。 当数字的总和为struct ListNode时,也会发生0大小的内存泄漏。我让你弄清楚并处理。

但是,如果列表中有更多数字表示的数字将最终使整数int num3 = num1+num2;溢出,则您的解决方案将无法正常工作。

最后,任务是在适当的位置添加两个列表,而不是从中提取数字并形成整数。