相关:flexible array member in a nested struct
我正在尝试将一些数据解析为结构。数据包含的信息组织如下:
struct unit {
struct unit_A {
// 28 bytes each
// dependency r6scA 1
char dr6scA1_tagclass[4];
uint32_t dr6scA1_tagnamepointer;
uint32_t dr6scA1_tagnamestringlength;
uint32_t dr6scA1_tagid;
// 12 bytes of 0x00
}A;
// A strings
struct unit_B {
// 48 bytes each
// dependency r6scB 1
char dr6scB1_tagclass[4];
uint32_t dr6scB1_tagnamepointer;
uint32_t dr6scB1_tagnamestringlength;
uint32_t dr6scB1_tagid;
// 32 bytes of 0x00
}B;
// B strings
// unit strings
}unit_container;
您可以忽略奇怪的命名法。
我的行注释 //A strings
、//B strings
和 //unit strings
每个都包含以 null 结尾的 C 字符串,其中的数量与数据中存在的 unit_A
、unit_B
和 unit
结构条目的数量一致。因此,如果 unit_container
中有 5 个 A
条目,那么在 //A strings
的位置就会有 5 个 C 字符串.
由于我无法在这些位置使用灵活的数组成员,因此我应该如何解释数据中这些位置的本质上未知数量的可变长度 C 字符串?
例如,这些位置的数据可能是:
“第一个条目在这里。\0第二个条目\0另一个!\0第四个。\0从任何合理的标准来看,这第五个条目都是最好的条目。\0”
...我希望我应该将其解释为:
字符单元_A_strings[]
...但这不可能。我有什么选择?
感谢您的考虑。
编辑:
我认为迄今为止最有吸引力的选择是:
char** unit_A_strings;
指向字符字符串数组。
如果我这样做:
char unit_A_strings[1];
定义一个固定大小为 1 个字符的字符数组,那么我必须放弃 sizeof(unit) 等,或者在内存分配大小方面遇到麻烦,即使它是最准确的存在的数据类型。如果我执行 char * unit_A_strings[1];
,也会发生同样的情况。
另一个问题:使用 char *unit_A_strings;
和 char** unit_A_strings;
有什么区别?
结论:
主要问题是结构体用于固定大小的信息,而我需要的是可变大小的信息内存区域。所以我无法将数据合法地存储到结构中——至少不能作为结构。这意味着任何其他解释都可以,在我看来,char**
是这种结构情况的最佳可用选项。
最佳答案
我认为它可以使用 char** 代替(或者你可以编写一些结构来包装它)。 例如,您可以编写一个帮助函数来解码您的流。
char** decodeMyStream(uint_8* stream, unsigned int* numberOfCString)
{
*numberOfCString = decodeNumberOfCString(stream);
char** cstrings = malloc((*numberOfCString) * sizeof(char*));
unsigned int start = 0;
for (unsigned int i = 0; i < *numberOfCString; ++i)
{
usigned int len = calculateIthStringLength(stream, start)
cstrings[i] = malloc((len) * sizeof(char));
memcpy(cstrings[i], stream + start, len);
start += len
}
return cstrings;
}
这只是无需思考的示例代码,你可以想出更多更好的算法。
关于c - 如何在嵌套 C 结构中使用灵活的数组成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37771041/