c++ - 使用表达式初始化数组

标签 c++ c arduino

<分区>

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++ 有自己的动态内存分配特殊关键字: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: Arrays , Dynamic Memory

C++:Dynamic Memory

关于c++ - 使用表达式初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12336773/

相关文章:

c++将dll注入(inject)cmd.exe监控命令

c++ - 了解我有多少内存可用于动态 vector C++

c - if语句中的执行顺序

c++ - 如何使arduino无人机具有侧倾,俯仰和偏航值稳定?

arduino - 设置引脚模式时 Wemos D1 重置

c++ - Arduino - 通过指针传递结构似乎比通过值慢

c++ - 为什么remove_reference 对函数不起作用?

c++ - 使用 Visual Studio 2013/2015 及更高版本在 MFC 应用程序中以 Windows XP 为目标

c - 传递不同目录的文件名时 Stat 函数不起作用

c - g_signal_connect 鼠标右键单击?