结构内部的动态可变长度C

结构内部的动态可变长度C,c,C,我试图为具有动态有效负载长度的数据包创建一个结构,该结构由header struct(LEN)中的一个变量确定 我不确定如何正确地做到这一点,我对我遇到的一些例子感到困惑。下面是我将要使用的结构的基础。 谢谢 您可以使用有时称为“弹性数组”的构造。(或者,正如@Jerry Coffin所指出的,“灵活阵列成员”)可变长度有效载荷需要位于末端: struct packet { struct header { unsigned char SRC; un

我试图为具有动态有效负载长度的数据包创建一个结构,该结构由header struct(LEN)中的一个变量确定

我不确定如何正确地做到这一点,我对我遇到的一些例子感到困惑。下面是我将要使用的结构的基础。 谢谢


您可以使用有时称为“弹性数组”的构造。(或者,正如@Jerry Coffin所指出的,“灵活阵列成员”)可变长度有效载荷需要位于末端:

struct packet
{
    struct header
    {
        unsigned char SRC;
        unsigned char DST;
        unsigned char NS : 3;       //3 bits long
        unsigned char NR : 3;
        unsigned char RSV : 1;      //1 bit long
        unsigned char LST : 1;
        unsigned char OP;
        unsigned char LEN;
    } HEADER;
     unsigned int CRC : 16;
     unsigned char payload[1];  //STRETCHY.
};

struct packet PACKET;   
这种类型的结构需要动态分配,因为您需要手动为有效负载留出足够的空间

PACKET * p = malloc( sizeof(PACKET)+payloadLength*sizeof(char) );
p->HEADER->LEN = payloadLength;
//fill in rest of header here.
memcpy(p->payload, incomingData, payloadLength);

您可以使用有时称为“弹性数组”的构造。(或者,正如@Jerry Coffin所指出的,“灵活阵列成员”)可变长度有效载荷需要位于末端:

struct packet
{
    struct header
    {
        unsigned char SRC;
        unsigned char DST;
        unsigned char NS : 3;       //3 bits long
        unsigned char NR : 3;
        unsigned char RSV : 1;      //1 bit long
        unsigned char LST : 1;
        unsigned char OP;
        unsigned char LEN;
    } HEADER;
     unsigned int CRC : 16;
     unsigned char payload[1];  //STRETCHY.
};

struct packet PACKET;   
这种类型的结构需要动态分配,因为您需要手动为有效负载留出足够的空间

PACKET * p = malloc( sizeof(PACKET)+payloadLength*sizeof(char) );
p->HEADER->LEN = payloadLength;
//fill in rest of header here.
memcpy(p->payload, incomingData, payloadLength);

您需要在结构中包括长度,但不包括数据。根据您正在做的事情,您处理数据的方式有所不同。该结构可能应该包含一个指向数据的指针,但在序列化或反序列化该结构时必须处理该指针。也就是说,当您读回指针时,它将毫无意义


因此,您写出结构,包括数据字段的大小,然后写出数据字段。当您读回它时,您可以fscanf结构,然后从流中读取结构告诉您要读取的字节大小,并将其存储为数据,最后在使用fscanf创建的结构中存储指向新读取数据的指针。如果您正在读取多个类似的项,则可以在此时继续读取下一个结构,然后读取数据,依此类推。

您需要在结构中包含长度,但不包括数据。根据您正在做的事情,您处理数据的方式有所不同。该结构可能应该包含一个指向数据的指针,但在序列化或反序列化该结构时必须处理该指针。也就是说,当您读回指针时,它将毫无意义


因此,您写出结构,包括数据字段的大小,然后写出数据字段。当您读回它时,您可以fscanf结构,然后从流中读取结构告诉您要读取的字节大小,并将其存储为数据,最后在使用fscanf创建的结构中存储指向新读取数据的指针。如果您正在读取多个类似的项,您可以在此时继续读取下一个结构,然后读取数据,依此类推。

将有效负载改为指针,并在运行时根据标题字段中
LEN
的值进行分配。

将有效负载改为指针,并在运行时根据
LEN
在标题字段中。

确保您接受最有用的答案。每次收到新数据包时,LEN都会更改,这会导致负载每次动态更改。访问此链接了解如何[接受答案][请确保您接受最有用的答案。每次收到新数据包时,LEN都会发生更改,从而导致负载每次动态更改。访问此网站,我想了解如何[接受答案][我第一次听说“弹性数组”。这通常称为“结构黑客”,或(在C99中)一个“灵活数组成员”。对于灵活的数组成员,您不包括下标,因此它只是
无符号字符负载[];
。这就是为什么我说“有时调用”.我觉得我店里的昵称不是通用的。另外,我认为下标是C99之前需要的。我相信你在所有方面都是对的。我甚至可能不会提起它,除非提供一些东西给谷歌,如果他/她觉得有必要的话。“另外,记下‘stretchy array’一词。我喜欢它。我想在对话中更经常地使用它。”(向梅切特将军道歉)我第一次听说“stretchy array”。这通常被称为“struct hack”,或者(在C99中)一个“flexible array member”。对于灵活的数组成员,您不包括下标,因此它只是
无符号字符负载[];
。这就是为什么我说“有时调用”.我觉得我店里的昵称不是通用的。另外,我认为下标是C99之前需要的。我相信你在所有方面都是对的。我甚至可能不会提起它,除非提供一些东西给谷歌,如果他/她觉得有必要的话。“另外,记下‘弹性阵列’这个词。我喜欢它。我想在谈话中更经常地使用它。”(向梅切特将军道歉)LEN根据数据包的大小由传入数据包更改。每当报头长度更改时,您需要手动调整有效负载的大小。它不会仅根据报头长度的更改而动态调整大小。LEN根据该数据包的大小由传入数据包更改。您需要d在标头长度更改时手动调整有效负载的大小。不会仅根据更改标头长度来动态调整有效负载的大小。