2016-08-14 25 views
2

这是我的一段代码。如何在C++ 11标准中初始化动态大小的数组?

int** n; 
    for (int i = 0; i < N; ++i){ 
     int size; 
     cin >> size; 
     int* n[i] = new int[size]; //line 13 
     for (int j = 0; j < size; ++j){ 
      cin >> n[i][j]; 
     } 
    } 

这是在编译期间弹出的错误。

solution.cc: In function 'int main()':

solution.cc:13:33: error: array must be initialized with a brace-enclosed initializer

int* n[i] = new int[size];

我意识到这可以使用矢量来完成,因为它们更好地动态处理内存。但我不允许使用矢量来应对这个挑战。我被允许使用的唯一标题是“iostream”。

,我读了,在C++ 11中,语法已修改为新的:

p = new T [N] {initializer1, ..., initializerN}; 

来源:https://en.wikipedia.org/wiki/New_and_delete_(C%2B%2B)#Overview

但我的代码仍然会产生类似的变种同样的错误。

有没有办法完全绕过初始化错误?如果不是,则假定这些值被初始化为,最好是相同的值。

+5

'n [i] = new int [size];'会让你通过编译器错误。但是,'n'是一个未初始化的指针,并且您试图对其进行解引用,因此您的程序会显示未定义的行为。 –

+1

Igor - 将此添加为答案 – doron

回答

12

我相信(恕我直言)你并不想真正的问题。

您已经申报了双指针:

int** n; 

然后你忘了为指针数组,喜欢的东西分配内存:

n = new int*[N] 

这一步是必要的,然后才能分配内存数组中的每个指针(指针)。

而且,我相信你行应该是:

n[i] = new int[size] 

否则你重新声明N + I的类型。

2

帮你一个忙,停止使用原始指针。代替原阵列尽可能的使用std::vector - 东西沿着这些路线:

std::vector<std::vector<int>> n(N); 
for (int i = 0; i < N; ++i){ 
    int size; 
    cin >> size; 
    n[i].resize(size); 
    for (int j = 0; j < size; ++j){ 
     cin >> n[i][j]; 
    } 
} 
+7

>我意识到这可以使用矢量来完成,因为它们在动态处理内存方面非常好。但我不允许使用矢量来应对这个挑战。 – Shoe

+4

不幸的是,这个答案没有解释OP代码的实际错误。因此,我认为这对任何想学习C/C++的人都没有帮助。 – cmaster

6

这应该可以解决您的问题。

int** n = new int*[N]; 

for (int i = 0; i < N; ++i){ 
    int size; 
    cin >> size; 
    n[i] = new int[size]; 

    for (int j = 0; j < size; ++j){ 
     cin >> n[i][j]; 
    } 
}