[英]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;
我無法理解其原因,因為這兩組語句彼此相同
因為這兩組陳述彼此相同
他們絕對不是。
*frontRef = source
表示取消引用 frontRef
並在返回的類型node
左值表達式上調用operator=
。
frontRef = &source
裝置采取的地址 source
並將其分配給frontRef
。
如果frontRef
未初始化或為null,則(1)是未定義的行為,但(2)沒問題。
*frontRef = source; *backRef = f;
frontRef = &source; backRef = &f;
這些並不等同。
第二個只是用另一個局部變量source
的地址更新局部變量frontRef
,所以它實際上不會影響調用方的任何內容。 你可能frontRef
是一個out參數但它根本沒有更新。 (對於backRef
也一樣。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.