0

可能重复:
为什么我不能创建一个大小由全局变量确定的数组?

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

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

这会产生错误:

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

但是如果我用实际数字替换表达式,它就可以工作

byte arg_listB[10]={0};  

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

4

3 回答 3

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: 数组动态内存

C++:动态内存

于 2012-09-09T06:33:31.587 回答
0

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

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

于 2012-09-09T08:42:53.260 回答
0

数组声明的初始化器仅适用于静态大小的数组,不适用于动态大小的数组。您可以做以下两件事之一 - 要么制作num_args一个编译时常量(#define可能带有 a ),要么分别分配和初始化:

byte arg_listB[2*num_args+10];
bzero(arg_listB, 2*num_args+10);
于 2012-09-09T05:37:59.233 回答