2012-09-09 75 views
0

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}; 

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

+2

在C++中,通过利用诸如'std :: array'和更相关的'std :: vector'之类的东西来解决这个问题。在C(至少C99)中,可以使用VLA作为该语言的一部分。 – chris

+0

@chris我不认为'std :: array'会解决它......但是'std :: vector'肯定会! – oldrinb

+0

@oldrinb,我在'std :: vector'的建议中几乎总是包含'std :: array'。前者是固定大小数组的好替代品。 – chris

回答

0

为一个数组声明初始化器仅适用于静态大小的数组,而不是动态大小的阵列。你可以做两件事情之一 - 要么使num_args编译时间常数(用#define,可能),或者分配并分别初始化:

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

请不要继续在C++中使用#define。 – chris

+1

...并不建议使用'bzero',它已被弃用POSIX(['std :: memset'](http://en.cppreference.com/w/cpp/string/byte/memset)也许?) tbh我宁愿使用'std :: fill(std :: begin(arg_listB),std :: end(arg_listB),0);';-) – oldrinb

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); 

从技术上讲,你可以用C中使用这些函数++如果包括<cstdlib>头。然而,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

0

我觉得你的C++代码是错误的,这种语言不具有可变长度的概念数组(VLA),即声明一个数组,其大小取决于一个变量。 (C++为此目标提供了其他工具。)

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