我想创建并初始化2D数组,但初始化失败。我遇到“程序意外完成了。”在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 :(得分: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循环完全相同,不需要进行任何更改。
答案 1 :(得分:3)
有什么问题?
你没有使用std::vector
(这是其中一个错误,@ Fredred涵盖了另一件事。)
#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;
}
}
}