From MWeb
在做leetcode 第2題時使用C語言編寫鏈表時報錯
錯誤復現
報錯時的代碼如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
if(l1==NULL) return l2;
if(l2==NULL) return l1;
struct ListNode* result=(struct ListNode*)malloc(sizeof(struct ListNode));
int tmp=l1->val+l2->val;
if(tmp<10){
result->val = tmp;
result->next = addTwoNumbers(l1->next,l2->next);
}else{
result->val = tmp%10;
struct ListNode* tmpN=(struct ListNode*)malloc(sizeof(struct ListNode));
tmpN->val=tmp/10;
result->next = addTwoNumbers(addTwoNumbers(l1->next,l2->next),tmpN);
}
return result;
}
運行后報錯
member access within misaligned address 0x000000000e91 for type 'struct ListNode', which requires 8 byte alignment (ListNode.c)
0x000000000e91: note: pointer points here
錯誤原因
在程序倒數第6行處申請了一個tmpN
指向的結構體ListNode
空間,而該結構體中包含next
指針,若該節點作為整個鏈表的最后一個節點,如l1
和l2
分別指向[5]
和[6]
時,此時tmpN
指向的空間並沒有初始化next
指針,因此報錯。
解決辦法
使用NULL
初始化next
指針指向的內容,如
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
if(l1==NULL) return l2;
if(l2==NULL) return l1;
struct ListNode* result=(struct ListNode*)malloc(sizeof(struct ListNode));
int tmp=l1->val+l2->val;
if(tmp<10){
result->val = tmp;
result->next = addTwoNumbers(l1->next,l2->next);
}else{
result->val = tmp%10;
struct ListNode* tmpN=(struct ListNode*)malloc(sizeof(struct ListNode));
tmpN->next=NULL;
tmpN->val=tmp/10;
result->next = addTwoNumbers(addTwoNumbers(l1->next,l2->next),tmpN);
}
return result;
}
By JZ
Less is more