运行时读入const int的值 - C ++

时间:2015-04-01 09:23:44

标签: c++ arrays variables const

我有一个程序,它将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];

2 个答案:

答案 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);

如果您知道尺寸不会改变,您可能想要使用指针而不是矢量。