簡體   English   中英

為什么我在這里遇到分段錯誤?

[英]Why do I get a segmentation fault here?

void LinkedList<T>::mergeSort(Node*& curr) {
    if (curr->next != nullptr) { //Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
        Node *ptr1 = nullptr;
        Node *ptr2 = curr;
        //splits linked list
        for (int i = 0; i < getLength() / 2; i++) {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
        }
        ptr1->next = nullptr;
        ptr1 = curr;
        //recursive call for sorting
        mergeSort(ptr1); //Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8)
        mergeSort(ptr2);
        //merge lists back together
        if (ptr1 == nullptr)
            curr = ptr2
        else if (ptr2 == nullptr)
            curr = ptr1

        Node *reff = ptr1;

        while (reff->next != nullptr) {
            reff = reff->next;
        }
        reff->next = ptr2;
        curr = reff;
    }
}

一切似乎都正常,期待這個 function。 我總是遇到分段錯誤,我很困惑為什么會發生這種情況。

另外,我在上大學,所以可能有更有效的方法,但這是我可以做到的方式,無需提前了解課程。

我有一個名為 length 的變量來保存長度。 那部分是老師實施的。

所以它給了我這個錯誤: Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeef3ffff8) 如何通過 code=2 和其他數字找出錯誤的含義?

有概率。 很多事情都錯了。 這顯示了如何使用std::list來完成。 我不知道是否給出了 API,但讓我們將其分開 function 以獲取列表。

template<typename T>
void mergesort( std::list<T>& list ){

如果我們有多個元素,則只有工作要做

    auto const size = list.size();
    if( size > 1) {

然后將該列表拆分為兩個列表。

        auto mid = list.begin();
        std::advance( mid, size/2 );        
        std::list<T> other;        
        other.splice( other.begin(), list, list.begin(), mid );

現在我們有兩個子列表,可以在它們上遞歸調用合並排序。

    mergesort( list );
    mergesort( other );

然后需要合並部分結果。

    list.merge( other );        

我們完成了。 此處查看工作版本

for(int i=0;i<getLength()/2;i++)

我有一個名為 length 的變量來保存長度。 那部分是老師實施的。

因此, getLength()LinkedList的成員 function 。 當我們進行遞歸調用時,它總是會告訴我們整個LinkedList的存儲length 但這不是我們想要的——我們想要傳入的Node鏈中的節點數。相反,當我們第一次進行遞歸調用時,我們嘗試將其拆分為與它已有的相同數量的節點(前半部分,后半部分為零節點)。 由於這沒有任何進展,我們最終將通過遞歸調用來炸毀堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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