2011-12-25 180 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; 
    } 
    } 
}