2014-02-26 19 views
0

運行以下代碼時出現分段錯誤。我知道這裏有一些基本的誤解,但我似乎無法弄清楚。分段錯誤 - 查找列表的根目錄

#include <iostream> 
using namespace std; 

struct intptr{ 
    intptr* a; 
    int value; 
}; 

void printint(intptr q){ 
    if (q.a == &q){ 
    cout<<q.value<<endl; 
    return; 
    } 
    else 
    printint(*(q.a)); 
} 

int main(){ 
    intptr y,z; 
    z.value = 1; 
    y.value = 2; 
    *(y.a) = z; 
    *(z.a) = z; 
    printint(x); 
} 

我也試過以下,但它從來沒有承認q.a = &q是真實的。

#include <iostream> 
using namespace std; 

struct intptr{ 
    intptr* a; 
    int value; 
}; 

void printint(intptr q){ 
    if (q.a == &q){ 
    cout<<q.value<<endl; 
    return; 
    } 
    else 
    cout<<"not finished"<<endl; 
    printint(*(q.a)); 
} 

int main(){ 
    intptr y,z; 
    z.value = 1; 
    y.value = 2; 
    y.a = &z; 
    z.a = &z; 
    printint(y); 
} 
+0

在你的第一個例子,你在結構體中聲明瞭intptr * a'這個指針,但是永遠不會給它一個有效的地址(即不要爲它分配一個地址)。所以它指向一個未定義的位置,並且'*(q.a)= z'將會崩潰。在這兩種情況下,'q'都是函數堆棧中的一個參數,所以它的地址不會與指針變量'a'匹配。 – lurker

+0

更改函數聲明以接受通過引用傳遞的參數解決了問題。 - void printint(intptr&q) –

回答

3

這裏是你的問題:

*(y.a) = z; 
    *(z.a) = z; 

您提領一null pointer。變量a從未初始化並指向任何內容。如果您打算使用指針,我強烈建議您遵循rule of 3

0

爲了在將來找到問題並避免類似問題,建議將指針初始化爲NULL,然後在操作它們之前檢查NULL。我建議你到一個構造函數添加到您的結構並初始化指針:

struct intptr 
{ 
    intptr* a; 
    int value; 

    intptr() 
    : a(NULL) 
    { } 
}; 
0

問題已經指出的@awesomeyi

試試下面的代碼:

y.a = &z; 
    z.a = &y;