运行-C++时读取常量int的值



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

如果你知道大小不会改变,你可能想使用指针而不是矢量。

最新更新