如何在C ++中动态声明一个指向整数的数组?

时间:2018-08-08 10:42:49

标签: c++ arrays pointers

为什么这样做?

int **ar1 = new int*[5];

这会在c ++中引发错误:

int *ar2[] = new int*[5];

我了解到,在第一种情况下,ar1表示指针到指针,而在第二种情况下,ar2表示指针到整数的数组。考虑到“ new int * [5]”这一行意味着新操作符正在返回指向内存空间的指针以存储5个指向整数的指针,第二种情况又是什么问题呢?

2 个答案:

答案 0 :(得分:3)

您正在尝试initialize数组对象。

  

初始化数组类型的对象时,初始化程序必须为   字符串文字(可选地用大括号括起来)或为   数组成员的括号括起来的列表

在您的情况下,您都不提供。大括号初始化例如:

int i = 1, j = 2;
int *ar2[] = {&i, &j};

答案 1 :(得分:0)

好吧,首先尝试简化问题

此问题与整数指针无关,您的问题出在数组本身。

因此,请尝试将其简化为整数数组

这有效

int a[] = {1, 2, 3, 4, 5, 6, 7};

这不起作用

int a[] = new int[7];

它失败并显示以下错误

  

错误:初始化程序无法确定“ a”的大小

在生成程序集的在线编译器上尝试过(在clang 6.0.0上尝试过)后,发现

int a[]
尝试在堆栈上分配

,这意味着应该在编译时知道大小,而new运算符的结果要到运行时才知道,因为它是动态的在上分配数组{通过系统调用进行的大量计算决定了数组在内存中的位置}。

有关堆栈vs堆的更多信息:

Stack and heap

注意::当函数中有一个[]参数时,就像*

所以

void doSomething(int b[]) {
}

int main() {
    doSomething(new int[100])
    return 0;
}

有效

问题主要是关于局部变量。

无论如何,如果您要编写一些生产代码,建议您使用shared_ptrvector和其他C ++功能,则不要进行C编程。