2013-02-10 127 views
0

有誰知道爲什麼這會給我一個分段錯誤?這個例子爲什麼會出現分段錯誤?

cell.h

struct cell{ 
    bool filled; 
    bool isParent; 
    //float px,py,pz,s; 
    bool cx,cy,cz; 
    unsigned char r,g,b; 
    vect norm; 
    struct cell* parent; 
    struct cell* child; 

    cell(bool cxx=0, bool cyy=0, bool czz=0); 

    void open_read(string); 
}; 

cell.cpp

cell::cell(bool cxx, bool cyy, bool czz) 
{ 
    cell childs[8];  // these lines creates a segmentation fault 
    child = &childs[0]; // these lines creates a segmentation fault 
    cx=cxx; 
    cy=cyy; 
    cz=czz; 
    norm = vect(0,0,0); 
    norm.normalize(); 
    isParent=false; 
    filled=true; 
} 

如果這是錯誤的方式做到這一點任何人都可以點我在正確的方向如何,我可以存儲一個指針到孩子的第一個元素[8],而不是存儲8個指針,因爲它是相當密集的內存。

回答

8

您正試圖設置無限遞歸。 cell的構造函數分配了一個包含8個cell對象的數組,其構造依次調用帶有默認參數的構造函數cell

每個堆棧幀都佔用空間,由於未終止的調用遞歸,堆棧遲早會變得比其大小限制更大,最終導致分段錯誤。

+0

如果它最終會停止,它並不是真正的無限......儘管這是一種不正經的態度。 – 2013-02-10 16:31:47

+0

@SteveWellens:對,我的意思是說他正在試圖建立一個。但你是對的。我編輯了我的答案。 – 2013-02-10 16:32:28

+0

哦,我應該看到,我想我需要看看我可以如何改變我的程序,所以我不需要在實際需要之前調用childs的構造函數。 – lasvig 2013-02-10 16:32:42

3

當您創建單個cell時,該cell的構造函數會創建一個包含更多8個cell的數組。其中每一個都創建了一個8 cell等數組等等。你有無限的遞歸。

目前還不清楚爲什麼你的構造函數創建了一個8 cell的數組 - 你只能接受第一個的地址。對於每個cell在構建時自動創建它自己的孩子也沒有意義。這將導致這種無限的cell s血統。

更何況,在構造函數的年底,cells的陣列將被銷燬,你會留下一個指針,指向一個無效的對象。

相關問題