包含字符数组数组的结构
A struct that contains an array of char arrays
我试图定义一个结构的实例,但在设置这个变量时遇到了特别的麻烦。这是一个由char数组组成的数组。
这是我的头文件中的结构。。。
struct widget_t {
char *name;
uint8_t numberOfNicknames;
char *nicknames[];
};
这是我试图设置widget_t
结构的实例。。。
widget_t SomeWidget;
void setUpFunction () {
SomeWidget.name = (char *)"Lawn Mower";
SomeWidget.numberOfNicknames = 2;
SomeWidget.nicknames = {
"Choppie McGrasschopper",
"Really Noisy"
};
}
因此,当我尝试将昵称放入SomeWidget.nicknames
时,就会发生错误。我不确定我是否需要做一些时髦的事情,比如用name
作为指针。。。?
棘手的是nicknames
的数量是可变的。因此,每个实例都希望设置不同数量的实例。
问题是c++不支持变量数组。相反,您必须使用new动态分配内存,或者在您的情况下使用new[]。
首先,您需要将数据类型更改为char**
,几乎等于之前的数据类型。然后您可以像这个nicknames = new char*[number_of_nicknames]
一样分配任意数量的字符串。
重要的是,使用此方法,您将不得不手动创建昵称,如下所示:delete[] nicknames;
。实现这一点的最佳方法是使用RAII(删除解构器中的昵称)
当你有动态字符串时,你会使用以下结构
struct widget_t {
// optional constructor to allocate nicknames
~widget_t()
{
for (int i = 0; i < numberOfNicknames; ++i)
{
char* nickname = nicknames[i];
if (nickname)
delete[] nickname;
}
delete[] nicknames;
}
char *name;
uint8_t numberOfNicknames;
char **nicknames = NULL;
};
并且使用常量字符串进行下一个
struct widget_t {
// optional constructor to allocate nicknames
// allocate nicknames like
// -> nicknames = new const char*[numberOfNicknames];
~widget_t()
{
if (nicknames) delete[] nicknames;
}
char *name;
uint8_t numberOfNicknames;
const char **nicknames = NULL;
};
一个选项是:
struct widget_t {
char const *name;
uint8_t numberOfNicknames;
char const * const *nicknames;
};
static char const *mower_nicknames[] = { "Choppie", "Bob" };
widget_t SomeWidget = { "Lawn Mower", 2, mower_nicknames };
static char const *bus_nicknames[] = { "Wheels", "Go", "Round" };
widget_t OtherWidget = { "Bus", 3, bus_nicknames };
// no setup function needed
您要做的是将字符串文本分配给char *
指针——这很糟糕(请参阅如何在GCC中消除deprecated conversion from string constant to ‘char*’
警告?)。以下是一种可能的方法:
#define MAX_NAME_LEN 128
#define MAX_NICK_NAMES 10
struct widget_t {
char name[MAX_NAME_LEN];
uint8_t numberOfNicknames;
char nicknames[MAX_NICK_NAMES][MAX_NAME_LEN];
};
widget_t SomeWidget;
void setUpFunction () {
strcpy(SomeWidget.name, "Lawn Mower");
SomeWidget.numberOfNicknames = 2;
strcpy(SomeWidget.nicknames[0], "Choppie McGrasschopper");
strcpy(SomeWidget.nicknames[1], "Really Noisy");
}
不管怎样,既然你用C++
来标记你的问题,我建议你使用std::string
和std::vector
。
这里有不同的问题。
首先是不完整类型中的最后一个成员,因为它是未声明维度的数组。这在C++中是不允许的,但大多数编译器都允许它作为与C具有相同语义的扩展。无论如何,这都很难使用,因为它只能与已分配的结构一起使用,即为结构本身分配内存和不完整数组。
接下来,您将尝试将分配给一个数组。你不能。数组不是C++中的第一类对象(在C中也不是)。可以将数组初始化为一个整体,但只能分配给数组元素。
最后,将一个C乱丢字符串分配给一个char *
。这很糟糕,因为标准声明乱丢字符串是const
,所以稍后使用指针来更改字符将是Undefined Behavior。如果不这样做,它会起作用,但指针至少应该声明为const
。
以下是如何使用所有这些:
widget_t* setUpFunction () {
// allocates a widget_t with 2 slots in nicknames
widget_t *someWidget = (widget_t *) malloc(sizeof(widget_t) + 2 * sizeof(char *));
someWidget.name = (char *)"Lawn Mower"; // VERY DANGEROUS: pointer should be const
someWidget.numberOfNicknames = 2;
someWidget.nicknames[0] = (char *) "Choppie McGrasschopper"; // SAME DANGER
someWidget.nicknames[1] = (char *) "Really Noisy" // Still same danger
return widget_t;
}
但所有这些都是C语言,在C++中应该避免。此外,它仍然需要分配内存,这可能不是你想要的Arduino
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 如何使用函数的输出初始化 const 数组结构字段?
- 传递数组结构、ofstream 和 interger 以运行
- 从文本文件中读取并输入到数组结构中,然后显示读取的数据C++
- 将文本文件读取到数组结构中
- C/C++中数组结构和数组结构的通用接口
- C++ MDC final-在字符类型的数组结构中按字母顺序对记录中的名称进行排序
- C++ 使用数组结构创建平衡的二叉搜索树
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- 使用 vector 在 c++ 中声明 3D 数组结构
- 数组结构无法正确打印
- 如何在C++中访问数组结构内部的数组结构
- CIN进入数组结构似乎什么也没输入
- ifstream将数组结构到txt文件中,然后尽可能将其提取为数组
- wlanapi-将WlanFreeMemory释放其WLAN_INTERFACE_INFO数组结构
- 显示数组结构 c++
- C++ 使用函数访问数组结构的方法是什么?
- 将庞大的数组结构复制到 GPU
- 如何封送包含字符矩阵的数组结构
- C++多维数组结构的对齐