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

3

不要逐个限制我的数组索引...


而是使用循环来访问它们。

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

是否可以使用limit的值来限制这些数据的索引? 当我使用data_1 [limit]时,我的代码会出现错误"需要常量表达式"

在C++中有没有其他方法可以使用另一个变量来限制这些数组的索引?


对不起,我之前标记为C语言,但是我刚刚意识到我所寻找的答案是基于C++的。感谢您的纠正。 - Aesthetic
6个回答

4

Here you go:

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

limit必须是一个常量。

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

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

3
错误信息告诉您,必须拥有常量表达式才能在堆栈上分配内存。要在堆栈上进行分配,您有两个选项(获取常量); 您可以使用
#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 */

2
您已经将此标记为C和C++,但在两者之间处理这个问题的正确方法是不同的。
在C中,假设您使用了一个相当新的编译器(C99或更新版本),您所做的方式是允许的,只要data_1、data_2和data_3是某个函数的局部变量。它们几乎肯定不应该是全局变量,因此对于C,显而易见的解决方法是将它们简单地作为需要它们的函数的局部变量(如果其他函数需要它们,则将它们作为参数传递)。
在C++中,您已经得到了一些解决方案,例如const-qualifying limit并动态分配其他三个项来解决即时问题。至少在我看来,这些都是次优选择。在大多数情况下,您应该使用std::vector而不是数组,在这种情况下,您不需要为了使事情正常而const-qualify limit:
int limit = 10;
std::vector<int> data_1(limit), data_2(limit), data_3(limit);

抱歉同时标记了两个,你是对的,但这是一个更简单的东西,可以利用向量。 - Aesthetic

1
使用宏或常量。
#define LIMIT 10

或者

const int LIMIT = 10;

1

适用于C和C++

#define LIMIT 10
int data[LIMIT];

只是为了纯粹的C++

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

0

看到有很多答案建议使用 #define,并且问题标记为 C++,我认为应该提到,使用 #define 有缺点,特别是编译器不知道 LIMIT 是什么,因为每个出现都在预处理阶段被删除并替换为值。因此,在调试时,您可能会收到引用该值(即本例中的10)但没有提到 LIMIT 的错误消息,因为它从未进入符号表。

因此,您应该优先使用

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

而不是

#define LIMIT 10

如果有机会的话(即如果您在C++中而不是在C中)。

正如前面提到的,使用std::vector会更简单,并且会消除这种常数表达式的需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接