在头结构之后访问数据

时间:2015-01-28 09:42:22

标签: c struct network-programming

我正在进行一些网络编程,并使用一些struct来描述我的帧头:

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);

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

ntohl(frame_header->field1);

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

2 个答案:

答案 0 :(得分:1)

好吧,如果我正确地理解你的问题,你可以做类似

的事情
uint8_t * data = (uint8_t *)buffer + sizeof (struct my_frame)

然后,data将指向标题后面的下一个uint8_t元素。

答案 1 :(得分:1)

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

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

请看Memory access and alignment

另一方面:

  

malloc为您提供的块保证对齐以便它   可以保存任何类型的数据。

然后,您可以使用malloc来跳过此问题:

uint8_t *buffer = malloc(BUFFER_SIZE);