我有一个程序,它将const int
定义为数组大小的值。无论如何我可以在程序第一次运行时更改此var的值吗?我只需要在开始时设置一次,但是当我尝试使用cin
进行设置时我无法编译程序,因为我收到错误声明:
error: array bound is not an integer constant before ‘]’ token
我理解这意味着没有为数组大小设置值,因此无法编译。我也尝试初始化我要设置为1
的var,然后在程序运行后更改它,但我也没有运气,得到相同的错误。
编辑:
前两行是新var
和新const int
我希望更改,以下是错误似乎来源的行。
int objectIndexSize;
const int numOfObjects = objectIndexSize;
Mat imageArray[numOfObjects];
Mat descriptorsArray[numOfObjects];
vector<KeyPoint> keypointArray[numOfObjects];
String objectName[numOfObjects];
String fileNamePostCut[numOfObjects];
答案 0 :(得分:2)
您无法动态地在堆栈上分配数组。您应该使用std::vector
。
答案 1 :(得分:0)
等变量
int arr[10];
嵌入在.data
部分下的可执行文件中。你有40个字节的零。当您将可执行映像(.code
,.data
和其他)加载到RAM中时,这些40个字节将存在。不需要分配任何东西,因为它已经由操作系统完成了。
(不确定是否存在非常大的内存块,因为内存可能会碎片化,而且可执行映像也不应该。可能编译器在幕后做了一些魔术。)
无论如何,这就是你无法做到的原因
int n = 10;
int arr[n];
但你可以做到
const int n = 10;
int arr[n];
是因为在第一种情况下,编译器并不知道n
是常量(由于优化可能会弄明白,但你明白了),在第二种情况下,它永远不会改变,这意味着编译器知道在可执行文件中预先分配了多少内存。
现在,你显然不能const int a; std::cin >> a;
,因为它根本不是常数。
你可以做的是:
int n;
std::cin >> n;
std::unique_ptr<int[]> arr(new int[n]); //C++11
//or
int *arr = new int[n]; //before C++11
或使用向量并告诉它保留您需要的内存,如下所示:
int n;
std::cin >> n;
std::vector<int> arr;
arr.reserve(n);
如果您知道尺寸不会改变,您可能想要使用指针而不是矢量。