带拖车的可变尺寸结构

dev*_*vin 1 c++ data-structures

我之前发布过这个主题,但现在我有一个更具体的问题/问题.

这是我的代码:

#include <cstdlib>
#include <iostream>

typedef struct{
    unsigned int h;
    unsigned int b[];
    unsigned int t;
 } pkt;

 int main(){

    unsigned int* arr = (unsigned int*) malloc(sizeof(int) * 10);
    arr[0] = 0xafbb0000;
    arr[1] = 0xafbb0001;
    arr[2] = 0xafbb0011;
    arr[3] = 0xafbb0111;
    arr[4] = 0xafbb1111;
    arr[5] = 0xafbc0000;
    arr[6] = 0xafbc0001;
    arr[7] = 0xafbc0011;
    arr[8] = 0xafbc0111;
    arr[9] = 0xafbc1111;

    pkt* p = (pkt*) malloc(sizeof(int)*13);
    p->h = 0x0905006a;

    int counter;
Run Code Online (Sandbox Code Playgroud)

这是我得到的(counter = 0; counter <10; counter ++)p-> b [counter] = arr [counter];

    p->t = 0x55555555;

    std::cout << "header is \n" << p->h << std::endl;
    std::cout << "body is" << std::endl;
    for(counter=0; counter < 10;++counter)
            std::cout << std::hex << *((p->b)+counter) << std::endl;
    std::cout << "trailer is \n" << p->t << std::endl;
Run Code Online (Sandbox Code Playgroud)

}

这就是我得到的

header is 
151322730
body is
55555555
afbb0001
afbb0011
afbb0111
afbb1111
afbc0000
afbc0001
afbc0011
afbc0111
afbc1111
trailer is 
55555555
Run Code Online (Sandbox Code Playgroud)

*(p-> b)被预告片取代!如果我删除了我分配预告片的行,即p-> t = 0x55555555;那么预告片和p-> b是相同的(afbb0000).

所以我的问题是,如何保持结构在顶部的定义方式,并使此数据包正常运行.

编辑:

我应该更清楚.我为网络应用程序写这个,所以我必须制作一个输出按照这个顺序排序的数据包,我通过写入文件并进行十六进制转储来测试它.所以我的问题是:

如何制作带有标题,可变大小的主体和预告片的数据包始终具有此顺序?我能想到的唯一两个解决方案是拥有许多不同的结构,或者有一个矢量.

也就是说,我可以在哪里结构

typedef struct{
        unsigned int h;
        unsigned int b[12];
        unsigned int t;
     } pkt1;

typedef struct{
        unsigned int h;
        unsigned int b[102];
        unsigned int t;
     } pkt2;

etc 
Run Code Online (Sandbox Code Playgroud)

或者我能做到

std::vector<unsigned int> pkt (12);
pkt[0] = header;
pkt[1] = data;
...
pkt[2]= data;
pkt[11] = trailer;
Run Code Online (Sandbox Code Playgroud)

我不喜欢这两种解决方案.有没有更好的办法??

此外,这是一个单独的问题,我将不得不做同样的事情来接收数据.做一些事情就像把数据块投射到矢量一样明智吗?我将以无效*的形式接收数据,我将知道最大长度.

cmc*_*nty 6

尝试更新结构,然后添加以下内容:

typedef struct{
    unsigned int h;
    unsigned int* b;
    unsigned int t;
 } pkt;

...
...

pkt p;
p->b = arr
Run Code Online (Sandbox Code Playgroud)

这是一个关于它正在做什么的视觉例子......

|----------------------|
|     header           |
|----------------------|
|     B   int*         |  -------  p->b = arr
|----------------------|        | 
|     trailer          |        |
|----------------------|        v
                              |----------------------| 
                        arr   |                      |
                              |    B items [0 ... N] |
                              |                      |
                              |----------------------|
Run Code Online (Sandbox Code Playgroud)

如果你想变得棘手,你可以做这样的事......

|----------------------|
|     header           |
|----------------------|
|     B   int*         |  -------  (= to memory address after trailer)
|----------------------|        | 
|     trailer          |        |
|----------------------|        |
|                      | <-------
|    B items [0 ... N] |
|                      |
|----------------------|
Run Code Online (Sandbox Code Playgroud)

这是后者的工作版本:

#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"

typedef struct{
    unsigned int h;
    unsigned int* b;
    unsigned int t;
 } pkt;

 int main(){

    pkt* p = (pkt*) malloc( sizeof(pkt) + sizeof(int)*10);
    p->h = 0x0905006a;
    p->b = &(p->t)+1;
    p->t = 0x55555555;

    p->b[0] = 0xafbb0000;
    p->b[1] = 0xafbb0001;
    p->b[2] = 0xafbb0011;
    p->b[3] = 0xafbb0111;
    p->b[4] = 0xafbb1111;
    p->b[5] = 0xafbc0000;
    p->b[6] = 0xafbc0001;
    p->b[7] = 0xafbc0011;
    p->b[8] = 0xafbc0111;
    p->b[9] = 0xafbc1111;

    int counter;
    printf( "header is \n" );
    printf( "%0x\n", p->h);
    printf( "body is\n" );
    for(counter=0; counter < 10;++counter)
            printf( "%0x\n", (p->b)[counter]);
    printf( "trailer is\n" );
    printf( "%0x\n", p->t );
 }
Run Code Online (Sandbox Code Playgroud)