簡體   English   中英

盡管使用等效語句,但分段錯誤的原因

[英]Reason for segmentation fault despite using equivalent statements

我編寫了一個在單鏈表上實現合並排序的函數,其中每個元素都有一個整數和一個下一個指針。 其中一個功能splitlist用於將給定的鏈表拆分為兩個鏈表

void splitList(struct node* source, struct node** frontRef, struct node** backRef)
{
    struct node *s, *f;
    s = source;
    f = s->next;
    while(f && f->next)
    {
        s = s->next;
        f = f->next->next;
    }
    *frontRef = source;
    f = s->next;
    s->next = NULL;
    *backRef = f;
}

這里source是指向給定鏈表的指針,frontRef和backRef是指針的引用,需要通過此函數分配。 fronRef應該引用第一個鏈表,而backreef應該引用第二個鏈表。 此代碼在行時給出分段錯誤

* frontRef = source; * backRef = f;

被替換為

frontRef =&source; backRef =&f;

我無法理解其原因,因為這兩組語句彼此相同

因為這兩組陳述彼此相同

他們絕對不是。

  1. *frontRef = source表示取消引用 frontRef並在返回的類型node 左值表達式上調用operator=

  2. frontRef = &source裝置采取的地址 source並將其分配frontRef

如果frontRef未初始化或為null,則(1)是未定義的行為,但(2)沒問題。

*frontRef = source; *backreef = f;

frontRef = &source; backreef = &f;

不等同於:

在此輸入圖像描述

一個正確分配frontback兩個鏈表,一個沒有,這導致分段錯誤。

  1. *frontRef = source; *backRef = f;
  2. frontRef = &source; backRef = &f;

這些並不等同。

第二個只是用另一個局部變量source的地址更新局部變量frontRef ,所以它實際上不會影響調用方的任何內容。 你可能frontRef是一個out參數但它根本沒有更新。 (對於backRef也一樣。)

暫無
暫無

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

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