为什么这样做?
int **ar1 = new int*[5];
这会在c ++中引发错误:
int *ar2[] = new int*[5];
我了解到,在第一种情况下,ar1表示指针到指针,而在第二种情况下,ar2表示指针到整数的数组。考虑到“ new int * [5]”这一行意味着新操作符正在返回指向内存空间的指针以存储5个指向整数的指针,第二种情况又是什么问题呢?
答案 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堆的更多信息:
注意::当函数中有一个[]
参数时,就像*
所以
void doSomething(int b[]) {
}
int main() {
doSomething(new int[100])
return 0;
}
有效
问题主要是关于局部变量。
无论如何,如果您要编写一些生产代码,建议您使用shared_ptr
,vector
和其他C ++功能,则不要进行C编程。