如何在C++ 11标准中初始化动态大小的数组?

Apa*_*ara 2 c++ arrays initialization dynamic-memory-allocation 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];
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是编译期间弹出的错误.

solution.cc:在函数'int main()'中:

solution.cc:13:33:error:数组必须用括号括起的初始值设定项初始化

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

我意识到这可以使用向量来完成,因为它们在动态处理内存方面要好得多.但我不允许使用向量来应对这一挑战.我被允许使用的唯一标题是"iostream".

我读到,在C++ 11中,语法已被修改为new:

    p = new T [N] {initializer1, ..., initializerN};
Run Code Online (Sandbox Code Playgroud)

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

但我的代码仍然会为类似的变体产生相同的错误.

有没有办法完全绕过初始化错误?如果不是,则假设将值初始化为优选地相同的值.

小智 12

我相信(恕我直言)你不是在寻找真正的问题.

你已经声明了一个双指针:

int** n;
Run Code Online (Sandbox Code Playgroud)

然后你忘记为指针数组分配内存,例如:

n = new int*[N]
Run Code Online (Sandbox Code Playgroud)

在为数组(指针)的每个指针分配内存之前,必须执行此步骤.

而且,我相信你的路线应该是:

n[i] = new int[size]
Run Code Online (Sandbox Code Playgroud)

否则你要重新声明n + i的类型.


Zer*_*nes 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];
    }
}
Run Code Online (Sandbox Code Playgroud)