如何在未对齐的缓冲区中使用结构

时间:2013-09-06 21:55:53

标签: c gcc network-programming arm strict-aliasing

在我的网络应用程序中,在收到的缓冲区中,我想使用偏移量作为指向已知结构的指针。 使用memcpy()2次(rx / tx)复制结构的每个字段都很重。 我知道我的gcc 4.7.2(选项:-O3)在cortex-a8上,在1条指令中做了memcpy(& a,& buff,4)未对齐。 所以,他可以访问unaligned int。 假设它可能有很多结构或大结构。 最好的方法是什么?

struct __attribute__ ((__packed__)) msg_struct {
  int a;  //0 offset
  char b; //4 offset
  int c;  //5 offset
  int d[100];  //9 offset
}

char buff[1000];// [0]:header_size [1-header_size]:header [header_size+1]msg_struct

func() {
  struct msg_struct *msg;
  recv ((void *)buff, sizeof(buff));
  msg=buff+header_size; // so, it is unaligned.
  ...
    // some work like:
    int valueRcv=msg->c;
  //or modify buff before send 
  msg->c=12;

  send(buff,sizeof(buff));
}

1 个答案:

答案 0 :(得分:3)

要指示GCC对结构及其成员使用一个字节的对齐方式,请使用this page上显示的GCC packed属性。在您的代码中,更改:

struct msg_struct {…}

为:

struct __attribute__ ((__packed__)) msg_struct {…}

您还需要更正指针算法。将header_size添加到buff会增加100 int个对象的距离,因为buff是指向int的指针。您应该将buff维护为unsigned char而非int的数组。