c - 结构 C 内的动态可变长度

标签 c

我正在尝试为具有动态负载长度并由 header 结构 (LEN) 中的变量确定的数据包创建结构。

我不确定如何正确地执行此操作,而且我对遇到的一些示例感到困惑。波纹管是我将要使用的基础结构。 谢谢。

struct packet
{
    unsigned char payload;
    unsigned int CRC : 16;

    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;

};

struct packet PACKET;

最佳答案

您可以使用有时称为“弹性数组”的结构。 (或者正如@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);

关于c - 结构 C 内的动态可变长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9899936/

相关文章:

c - 从控制台中删除新行字符

c - 使用 snprintf 进行字符串连接

c - 管道传输时程序输出发生变化

c - 带引用参数的 printf

缩放时开罗图像模糊

c - 为什么嵌套 'for' 循环在下面的程序中不起作用?

C 可变参数函数 : need to keep multiple va_list but old ones are overwritten by latest one

c++ - 使用 gcc 进行静态和动态链接

c - SIGPIPE中一个简单的二进程程序

c - fread() : Reading from a file (without alignment) results in skipping of bytes