使用表达式初始化数组

时间:2012-09-09 05:31:50

标签: c++ c arduino

  

可能重复:
  Why can't I create an array with size determined by a global variable?

我正在尝试使用如下所示的表达式初始化数组,然后将所有值分配给零。

byte arg_listB[2*num_args+10]={0};  

这会产生错误:

error: variable-sized object 'arg_listB' may not be initialized

但如果我用实际数字替换表达式就可以了

byte arg_listB[10]={0};  

为什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

声明静态数组时,必须使用常量值,例如文字或常量变量。您可以使用#define关键字为文字指定名称,或者声明并初始化常量变量,如果您只是想让代码更易读和更易于管理:

#define NUM_ARGS 5
/*...*/
byte arg_listB[NUM_ARGS];

但是,为了使用表达式设置数组的大小,您必须使用指针创建动态数组。如何完成取决于您使用的语言。在C中,您可以使用calloc函数来创建数组:

#include <stdlib.h> //required for calloc
/*...*/
int num_args = 5;
byte* arg_listB = (byte*)calloc(2*num_args+10, sizeof(byte));

这将动态创建一个与数组大小相同的内存块,并将第一个字节的地址分配给指针。需要注意的一点是calloc会自动将数组中的元素初始化为0,因此该部分已经为您完成。当然,您还需要记住在完成数组后清理分配的内存,如下所示:

free(arg_listB);

从技术上讲,如果包含<cstdlib>标题,则可以在C ++中使用这些函数。但是,C ++有自己的特殊关键字用于动态内存分配:newdelete。这些可以像这样使用:

/*...*/
int num_args = 5;
byte* arg_listB = new byte[2*num_args+10];
//initialize your array

//free the memory when done with the array
delete[] arg_listB;

如评论中所述,您需要在声明后初始化数组,并且在完成后不要忘记释放内存。由于内存管理和动态数组的内容远不止这些内容,我强烈建议您查看它们。以下是一些可能有用的文章:

C: ArraysDynamic Memory

C ++:Dynamic Memory

答案 1 :(得分:0)

数组声明的初始化程序仅适用于静态大小的数组,而不适用于动态大小的数组。您可以执行以下两项操作之一 - 使num_args成为编译时常量(可能使用#define),或者单独分配和初始化:

byte arg_listB[2*num_args+10];
bzero(arg_listB, 2*num_args+10);

答案 2 :(得分:0)

我认为您的C ++标记是错误的,该语言没有您正在使用的可变长度数组(VLA)的概念,即声明一个大小取决于变量的数组。 (C ++有其他工具可以实现这一目标。)

在C中,无法初始化VLA,您必须通过C库函数memset分配给各个成员或设置字节。