簡體   English   中英

C++ 分段錯誤:11 錯誤,同時編碼添加兩個數字的鏈表

[英]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 使程序能夠應對常見問題。
  • 無需顯式調用“免費”。

這是 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 則不會執行構造函數。

對您的類/結構使用newdelete ,例如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM