我有一个程序,它将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];
不能在堆栈上动态分配数组。您应该使用std::vector
。
等变量
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);
如果你知道大小不会改变,你可能想使用指针而不是矢量。