2013-10-27 43 views
0

所以這是我的代碼:爲什麼這個循環沒有檢測到空指針?

while(node) { 
    cout<<node->getDiameter(); 
    node=node->stepAbove(); 
} 

這些都是方法:

Node* Node::stepAbove() { 
    return this->above; 
} 
int Node::getDiameter() { 
    return this->r; 
} 

但while循環導致訪問衝突,因爲迴路沒有檢測到空指針。調試時,它指向一個沒有定義的地址「0xcccccccc」......任何問題的建議?

編輯:忘了後我的構造函數是:

Node(int x=0) { 
    this->above=nullptr; 
    this->r=x; 
} 
+1

聽起來你實際上沒有空指針... –

+2

它不是null,它是未初始化的。很可能在'this-> above'行。 – azz

+0

這是令我困惑的事情。爲什麼它沒有指向null,因爲它從未初始化? – NitroNbg

回答

3

是有區別的所述uninitialized指針和null指針在C++

0之間
struct node 
{ 

}; 

int main() 
{ 
    node *n1 = 0; 
    node *n2; 

    if(!n1) 
     std::cout << "n1 points to the NULL"; 

    if(!n2) 
     std::cout << "n2 points to the NULL"; 
} 

嘗試運行此代碼,您將看到n2指向NULL將不會被打印。你想知道爲什麼?這是因爲n1已被明確指向null,但我沒有做同樣的n2。 С++標準不指定未初始化的指針應該保存的地址。在那裏,0xcccccccc似乎是您的編譯器選擇爲調試模式的默認地址。

+0

Lukily,如果你這樣做,大多數編譯器會發出警告。所以還有一個理由不要忽略任何編譯器警告;-) – PMF

1

在你的構造函數,設置字段設置爲null不是由構造函數的參數初始化,例如:

Node::Node(float radius) 
{ 
    above = NULL; 
    r = radius; 
}