在C++中使用另一个变量作为数组索引限制

Using another variable for array index limit in C++

本文关键字:数组 索引 变量 C++ 另一个      更新时间:2023-10-16

而不是一个接一个地限制我的数组索引...

int limit=10, data_1[10], data_2[10], data_3[10];

是否可以使用 limit 的值来限制这些数据的输入?我的代码在使用时收到错误"需要常量表达式"data_1[limit]

有什么解决方案可以使用另一个变量来限制这些数组在C++中的误差吗?

你来了:

const int limit = 10;
int data_1[limit], data_2[limit], data_3[limit];

limit必须是一个常量

编辑:正如其他答案所提到的,限制也可以简单地通过预处理步骤来定义,如下所示:

#define LIMIT 10 // Usually preprocessor-defined variables are in all caps

错误消息告诉您必须具有常量表达式才能在堆栈上分配内存。对于在堆栈上分配,您有两个选择(用于获取常量);你可以使用

#define LIMIT 10

或者你可以使用这样的const int

const int LIMIT = 10;

对于任何一个,这将起作用

 int data_1[LIMIT], data_2[LIMIT], data_3[LIMIT];

您也可以在堆上分配(使用 malloc() ),但随后还必须调用 free()

 int *data = (int *) malloc(limit * sizeof(int)); /* as an example */
 /* Do something, check that malloc succeeded */
 free(data); /* free the memory */

您已经用 C 和 C++ 标记了它,但处理此问题的正确方法在两者之间是不同的。

在 C 语言中,假设有一个相当最新的(C99 或更高版本)编译器,只要data_1data_2data_3是某个函数的本地,你就允许你做事的方式。它们几乎肯定不应该是全局变量,所以对于 C 来说,显而易见的解决方法是简单地将它们放在需要它们的函数的本地(如果其他函数需要它们,请将它们作为参数传递)。

在C++中,您已经得到了一些解决当前问题的答案,例如恒常资格limit和动态分配其他三个项目。至少在我看来,这些都是较差的选择。在大多数情况下,您应该使用 std::vector 而不是数组,在这种情况下,您不需要 const-限定限制即可使事情变得正常:

int limit = 10;
std::vector<int> data_1(limit), data_2(limit), data_3(limit);

使用宏或常量

#define LIMIT 10

const int LIMIT = 10;

表示 C 和 C++

#define LIMIT 10
int data[LIMIT];

只为C++

const int LIMIT = 10;
int data[LIMIT];

看到建议使用#define的答案数量,并且由于 Q 被标记为C++,我认为应该提到,不过,使用 #define 有缺点,尤其是编译器不知道LIMIT是什么,因为在预处理阶段删除每个出现并替换为值。因此,在调试时,您可能会收到一条引用该值的错误消息(即 10在这种情况下),但没有提到LIMIT,因为它从未进入符号表。

因此,您应该更喜欢使用

const int Limit = 10;
int data[Limit];

而不是

#define LIMIT 10
如果你

有机会(即如果你在C++,而不是在C)。

如前所述,使用std::vector会更简单,并且不需要这种常量表达式。