[英]C++ Segmentation fault: 11 Error, while coding linkedlist that adds two numbers
我有如下代碼:
#include <iostream>
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr){}
ListNode(int x) : val(x), next(nullptr){}
ListNode(int x, ListNode *next) : val(x), next(next){}
};
void print(ListNode *head) {
ListNode *l = head;
while (l)
{
std::cout << "val is " << l->val << std::endl;
l = l->next;
}
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
int sum = 0, quo = 0, rem = 0;
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
ListNode *curr, *prev = nullptr;
while (l1 || l2)
{
// Calculate value
sum = (l1->val + l2->val + quo);
quo = sum / 10;
rem = sum - quo * 10;
// Add node
if(prev == nullptr) {
curr = head;
} else {
curr = (ListNode *)malloc(sizeof(ListNode));
prev->next = curr;
}
curr->val = rem;
prev = curr;
l1 = l1->next;
l2 = l2->next;
}
return head;
}
int main() {
ListNode *node1_1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node1_2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node1_3 = (ListNode *)malloc(sizeof(ListNode));
node1_1->val = 2;
node1_2->val = 4;
node1_3->val = 3;
node1_1->next = node1_2;
node1_2->next = node1_3;
ListNode *node2_1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node2_2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node2_3 = (ListNode *)malloc(sizeof(ListNode));
node2_1->val = 5;
node2_2->val = 6;
node2_3->val = 4;
node2_1->next = node2_2;
node2_2->next = node2_3;
free(node1_1);
free(node1_2);
free(node1_3);
free(node2_1);
free(node2_2);
free(node2_3);
print(addTwoNumbers(node1_1, node2_1));
}
問題是,當我嘗試在 vscode 上運行此代碼時,我不斷收到錯誤消息:
/bin/sh: line 1: 96278 Segmentation fault: 11 "/Users/cpp/"leet_add_two_nums
我懷疑這個問題與malloc有關,但找不到線索。
我嘗試在 malloc 之后釋放,但這不是問題。
我對 C++ 很陌生,有人可以幫忙嗎?
另外,如果有人告訴我如何改進我的代碼,我將不勝感激!
提前非常感謝!
while (l1 || l2)
這意味着“當l1
不是nullptr
或者l2
不是nullptr
時,繼續循環!
你想要一個 AND :
while(l1 && l2)
此外,在調用addTwoNumbers
之前釋放列表中的所有節點! 將您的addTwoNumbers
調用移到所有free
之前。
在這里運行: https://ideone.com/f4kBIh
通過用“新”替換malloc可以輕松解決該問題
使用“新”有以下好處:
這是 malloc 替換為新的工作代碼:
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr){}
ListNode(int x) : val(x), next(nullptr){}
ListNode(int x, ListNode *next) : val(x), next(next){}
};
void print(ListNode *head) {
ListNode *l = head;
while (l) {
std::cout << "val is " << l->val << std::endl;
l = l->next;
}
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
int sum = 0, quo = 0, rem = 0;
ListNode *head = new ListNode[(sizeof(ListNode))];
ListNode *curr, *prev = nullptr;
while (l1 || l2) {
// Calculate value
sum = (l1->val + l2->val + quo);
quo = sum / 10;
rem = sum - quo * 10;
// Add node
if(prev == nullptr) {
curr = head;
} else {
curr = new ListNode[(sizeof(ListNode))];
prev->next = curr;
}
curr->val = rem;
prev = curr;
l1 = l1->next;
l2 = l2->next;
}
return head;
}
int main() {
ListNode *node1_1 = new ListNode[(sizeof(ListNode))];
ListNode *node1_2 = new ListNode[(sizeof(ListNode))];
ListNode *node1_3 = new ListNode[(sizeof(ListNode))];
node1_1->val = 2;
node1_2->val = 4;
node1_3->val = 3;
node1_1->next = node1_2;
node1_2->next = node1_3;
ListNode *node2_1 = new ListNode[(sizeof(ListNode))];
ListNode *node2_2 = new ListNode[(sizeof(ListNode))];
ListNode *node2_3 = new ListNode[(sizeof(ListNode))];
node2_1->val = 5;
node2_2->val = 6;
node2_3->val = 4;
node2_1->next = node2_2;
node2_2->next = node2_3;
print(addTwoNumbers(node1_1, node2_1));
}
Output:
val is 7
val is 0
val is 8
好的,關於這段代碼的一些評論
構造函數在類中很棒,但是如果您使用 C malloc 則不會執行構造函數。
對您的類/結構使用new
和delete
,例如 ListNode,這樣下一步實際上將是 null,正如您在構造函數中指定的那樣,否則它將被未初始化
你的 while 循環
while (l1 || l2)
將一直持續到兩者都是 null,但如果其中一個碰巧轉向 null,您將取消引用它,因為另一個可能不是 null:
l1 = l1->next;
l2 = l2->next;
(順便說一句,使用更好的變量名,使用簡短的、神秘的變量名沒有優勢)
在你主要的 function - 你已經釋放了 node1_1 和 node1_2 的 memory 但仍然在你的 function 調用print(addTwoNumbers(node1_1,node2_1))
int main() {
ListNode *node1_1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node1_2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node1_3 = (ListNode *)malloc(sizeof(ListNode));
node1_1->val = 2;
node1_2->val = 4;
node1_3->val = 3;
node1_1->next = node1_2;
node1_2->next = node1_3;
ListNode *node2_1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node2_2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *node2_3 = (ListNode *)malloc(sizeof(ListNode));
node2_1->val = 5;
node2_2->val = 6;
node2_3->val = 4;
node2_1->next = node2_2;
node2_2->next = node2_3;
free(node1_1);
free(node1_2);
free(node1_3);
free(node2_1);
free(node2_2);
free(node2_3);
print(addTwoNumbers(node1_1, node2_1)); <<== node1_1,node2_1, already freed
}
而是做這樣的事情
#include <iostream>
int main() {
auto node1_1 = new ListNode;
auto node1_2 = new ListNode;
auto node1_3 = new ListNode;
node1_1->val = 2;
node1_2->val = 4;
node1_3->val = 3;
node1_1->next = node1_2;
node1_2->next = node1_3;
ListNode *node2_1 = new ListNode;
ListNode *node2_2 = new ListNode;
ListNode *node2_3 = new ListNode;
node2_1->val = 5;
node2_2->val = 6;
node2_3->val = 4;
node2_1->next = node2_2;
node2_2->next = node2_3;
std::cout << addTwoNumbers(node1_1, node2_1);
delete node1_1;
delete node1_2;
delete node1_3;
delete node2_1;
delete node2_2;
delete node2_3;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.