c - 结构数据对齐。大小必须是存在的最大类型的整数倍?

标签 c struct

我正在制作一个通过串行端口发送/接收数据的 GUI。数据由在如下结构中定义的消息组成:

typedef struct
{
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint16_t d[3];
    uint16_t e;
} MyMsg_t;

我也在使用 union ,因为它使我能够更轻松地设置数据字段并能够逐字节发送它。 union 看起来像这样:

typedef union
{
    MyMsg_t msg;
    uint8_t array[MyMsgLength];
} MyMsg;

我现在尝试向这样的消息中添加一些数据:

MyMsg msg;

msg.msg.a    = (uint8_t) 1;
msg.msg.b    = (uint8_t) 2;
msg.msg.c    = (uint8_t) 3;
msg.msg.d[0] = (uint16_t) 4;
msg.msg.d[1] = (uint16_t) 5;
msg.msg.d[2] = (uint16_t) 6;
msg.msg.e    = (uint16_t) 7;

我通过串行总线逐字节传输它,接收端是:

1 2 3 19 4 0 5 0 6 0 7

(c到e中的数据因为总线的原因颠倒了)

这看起来像结构实际上是:

typedef struct
{
    uint8_t a; //1
    uint8_t b; //2
    uint8_t c; //3
    //uint8_t x //19
    uint16_t d[3];
    uint16_t e;
} MyMsg_t;

由此我可以假设它在 C 标准的某处说在这种情况下结构必须是最小 n * sizeof(uint16_t) 因为我们不能在结构中有例如 3.5 的最大类型,但它有是一个整数?

我猜这就是所谓的padding?有什么方法可以强制结构为 n * sizeof(uint8_t),即使存在更大的类型也是如此?

我知道如何避免这种情况,但它不需要使用 union 和更多代码。有什么方法可以通过最少的代码干预优雅地避免这个问题吗?

最佳答案

不要忘记机器的字节顺序,这就是为什么不推荐这样做的原因。如果您不关心字节顺序或以其他方式处理它,那么这种方法是可以接受的。

您可以更改对齐方式以消除填充。然而,这是如何完成的取决于编译器:

其他编译器可能有其他选项或方法来完成同样的事情。

关于c - 结构数据对齐。大小必须是存在的最大类型的整数倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224783/

相关文章:

c - 这是什么宏?

ios - 在 Objective C 中动态设置 C 结构数组的大小?

创建、传递、返回结构数组并在 C 中循环遍历 int

带有 typedef 的结构中的 C 枚举定义

c++ - 为什么我的代码块上没有显示输出?

c - 无效写入——Valgrind

无法将字符串分配给 C 中的扑克牌程序的单个字符变量

C 段错误 : memory altered between functions strcmp

根据文件中的数字创建新变量 - C

c - 字符串连接错误与 malloc 动态内存分配