c - 如何在嵌套 C 结构中使用灵活的数组成员?

标签 c arrays struct c-strings

相关: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_Aunit_Bunit 结构条目的数量一致。因此,如果 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/

相关文章:

javascript - 在 session 中放置一个列表并显示每个 session

javascript - 在没有 cv.imshow() 的情况下显示 Opencv.js 矩阵

Javascript:返回长 CR 分隔列表作为变量

function - 如何从 Go/Golang 中的另一个方法表达式访问方法表达式(结构函数)?

检查 Linux 中的端口可用性

c - 如何找出用户输入包含 C 中的非 ASCII 字符

c - 使用/比较内存地址的类型

c - 将 void 指针类型转换为结构类型

c - 从一个 header 到另一个 header 中的结构的结构

c - scanf 检测前导 0