2011-12-25 185 views
1

我想創建並初始化二維數組,但初始化失敗。我遇到「該程序意外完成。」在Qt Creator中。動態二維數組初始化

有什麼不對?

在.h文件中

private: 
    int pop; 
    int d; 
    float **uye; 

在.cpp文件

pop=50; 
d=12; 
uye = new float*[pop]; 
for(int i=0; i<d; i++) uye[i] = new float[d]; 

for(int n=0; n<pop; n++) 
{ 
    for(int m=0; m<d; m++) 
    { 
     uye[n][m] = (float) n*m; 
    } 
} 
+0

在運行時確定尺寸不泄漏的2D鋸齒狀數組:'std :: vector >'。 – 2011-12-25 11:49:41

回答

3

第一循環for(int i=0; i<d; i++)大概應該是for(int i=0; i<pop; i++)。否則,您只保留12個元素的空間,但後來嘗試訪問50.

請注意,在現代C++中使用原始指針成員被認爲是一個非常糟糕的主意,因爲您需要擔心複製語義。最好使用平板std::vector<float>並手動執行2D到1D的映射,或使用帶有方便訪問語法的std::vector<std::vector<float> >

我寧願第二個版本。沒有看到更多的上下文:

pop = 50; 
d = 12; 
uye = std::vector<std::vector<float> >(pop, std::vector<float>(d)); 

後面的嵌套for循環完全相同,無需更改。

3

出了什麼問題?

你沒有使用std::vector(這是錯誤的事情之一,@FredO報道了另一件事)。

#include <vector> 

int main(){ 
    typedef std::vector<float> inner_vec; 
    typedef std::vector<inner_vec> outer_vec; 

    int pop = 50, d = 12; 
    // first parameter to vector is its size 
    // second is what every element should be initialized to 
    outer_vec uye(pop, inner_vec(d)); 
    for(unsigned n = 0; n < uye.size(); ++n){ 
    for(unsigned m = 0; m < uye[n].size(); ++m){ 
     uye[n][m] = (float)n*m; 
    } 
    } 
}