正如问题所述,这是可行的:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int k[i][i];
}
这里我声明了一个大小为 i x i 的数组,两个维度都是变量。
但不是这个:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int** k = new int[i][i];
delete[] k;
}
我收到一条编译器消息告诉我
错误:只有分配数组的第一个维度可能具有动态大小
我被迫这样做:
#include <iostream>
int main(int argc, char *argv[])
{
unsigned short int i;
std::cin >> i;
unsigned long long int** k = new unsigned long long int*[i];
for ( unsigned short int idx = 0 ; idx < i ; ++ i )
k[idx] = new unsigned long long int[i];
for ( unsigned short int idx = 0 ; idx < i ; ++ i )
delete[] k[idx];
delete[] k;
}
据我了解,new 和 delete 用于在堆上分配一些东西,而不是在堆栈上,当它超出范围时不会被删除,并且对于跨函数和对象传递数据等很有用。
我不明白的是,当我k
在第一个示例中声明时会发生什么,我被告知声明的数组应该(并且可以)只有恒定的尺寸,并且当需要一个未知大小的数组时,应该始终考虑new
&delete
或vector
s。
我没有得到的这两个解决方案有什么优点和缺点,还是它就是这样?
顺便说一句,我正在使用 Apple 的 LLVM 编译器。