Possible Duplicate:
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};
为什么?我该如何解决这个问题?
声明静态数组时,必须使用常量值,如文字或常量变量。您可以使用 #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++ 中使用这些函数 header 。但是,C++ 有自己的动态内存分配特殊关键字:new
和 delete
.这些可以像这样使用:
/*...*/
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:
Arrays ,
Dynamic Memory
C++:Dynamic Memory