动态二维数组初始化

时间:2011-12-25 11:41:08

标签: c++ multidimensional-array dynamic-memory-allocation

我想创建并初始化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;
    }
}

2 个答案:

答案 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;
    }
  }
}