在C++中使用另一个变量作为数组索引限制
Using another variable for array index limit in C++
而不是一个接一个地限制我的数组索引...
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_1
、data_2
和data_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
会更简单,并且不需要这种常量表达式。
- 数组索引的值没有增加
- 并行用于C++17中数组索引范围内的循环
- 数组索引重载错误
- 通过指针与数组引用扩展数组索引序列
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 缓冲区溢出 - 数组索引越界(严重)
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 查找下一个具有真值C++的数组索引
- 在编译时自动生成用于稀疏数组索引的switch语句
- 在数组索引上引发异常
- C++ 将二维数组索引与条件语句中的函数值进行比较
- 平衡数组索引,同时从左和右对数组求和
- 为什么C ,Devstudio,数组索引工作
- 如何对同一数组索引下的结构成员进行排序?
- 我想返回数组索引,而不是数组值
- C++相当于 Python 的:用于数组索引
- 分段错误:为什么这里的数组索引越界了
- 数组索引在地图上不是整数
- 根据用户输入的每个字母添加到数组索引
- C 数组索引