2012-07-16 49 views
-1

我正在寫一個程序,分裂圖,我有一個類 圖和算法類。我計算我的算法類中的分區,並根據分區使用Graph類中的方法分割圖。C++ NULL終止陣列段錯誤

我的代碼如下所示: 在我GraphClass:

void bisectGraph(int *iPartitioning, Graph **Subgraphs, Edge **Separator){ 
... 
    // Store separators in an array 
Separator = new Edge*[Separators.size()+1]; //Separators is a vector containing the separating edges 
if(Separator == NULL) 
    writeErrorMsg("Error assigning memory.", "Graph::bisectGraph"); 
for(i=0, SepIter = Separators.begin(); SepIter != Separators.end(); i++, SepIter++) 
    Separator[i] = *SepIter; 
Separator[Separators.size()] = NULL; 

} 

在我的算法CLAS我這樣稱呼它:

Edge** separators; 
Graph** subgraphs; 
int somePartitioning; 

g->bisectGraph(somePartitioning, subgraphs, separators); 

做工精細,到目前爲止,但是當我要工作在我這樣的分離器陣列上:

for(int i=0; separators[i]!=NULL, i++){ 
    ... 
} 

我總是得到一個段故障。 ddd告訴我,在bisectGraph分隔符的結尾包含一些內容。由於我找不到任何其他錯誤,我認爲我有一些概念錯誤?

+0

你從哪裏得到分隔符?這是外部的全球變量嗎? – 2012-07-16 11:49:49

+0

問題似乎在別的地方。你可以放更多的代碼嗎? – Shahbaz 2012-07-16 11:54:56

回答

1

Separator的新值不會傳播到函數調用外部的separators變量。儘管它的類型爲Edge **,但您只是將它分配給該函數,但它只能分配給函數的變量副本。請記住,除非另有說明,否則C++是按值傳遞的。

您可以將簽名更改爲Edge **&,但使用矢量並採用類型爲vector<Edge *> &的參數會更明智。

+1

其實C++總是*傳值;只是你可以傳遞一個引用或一個指針(通過值),這允許取消引用指向/引用的變量。 ;-) – DevSolar 2012-07-16 12:35:24