在 header 结构之后访问数据

Access data after a header structure

我正在做一些网络编程,我用一些struct来描述我的框架header这样的:

struct my_frame_header {
    uint16_t field1;
    uint16_t field2;
};

所以,当我有一个缓冲帧时,我可以做类似的事情:

uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;

my_read(buffer, BUFFER_SIZE);

我现在可以像这样访问 header 字段:

ntohl(frame_header->field1);

现在,我的问题是:在结构之后访问数据的最优雅的方式是什么? (即在数据部分)

好吧,如果我正确理解你的问题,你可以这样做

uint8_t * data = (uint8_t *)buffer + sizeof (struct my_frame)

那么,data 将是指向 header 之后的下一个 uint8_t 元素的指针。

uint8_t buffer[BUFFER_SIZE];
struct my_frame_header *frame_header = (struct my_frame_header *)buffer;

这是错误的,buffer的基地址可以不对齐my_frame_header

看看Memory access and alignment

另一方面:

The block that malloc gives you is guaranteed to be aligned so that it can hold any type of data.

那么,你可以使用malloc来跳过这个问题:

uint8_t *buffer = malloc(BUFFER_SIZE);