首页 > 解决方案 > C - 将结构解构为字符数组

问题描述

为什么下面的代码会产生

09 17 13 FFFFFF88

我希望看到的地方

09 13 88

下面的代码

struct ztest
{
  uint8_t a;
  uint16_t b;
};

struct ztest zt;
char * dd = (char *) &zt;
zt.a = 9;
zt.b = 5000;
for (i = 0; i < sizeof(zt); i++) {
   printf("%02X ",dd[i]);
}

这是在 openwrt 系统 ar71xx 上运行的。目的是通过串行线路发送 char 数组(如果相关)。

标签: carraysstruct

解决方案


您的代码依赖于实现定义的行为,因此在不知道运行它的系统的细节的情况下无法预测您将看到的内容:

  • 的大小struct ztest可能包括填充
  • char可以签名或未签名
  • 的字节uint16_t可以以大端或小端形式存储

似乎您的系统向 s 添加了一个字节的填充struct ztest,使用带符号char的 s,并将uint16_t最高有效字节存储在较低的地址。

的值0x17是填充字节中的“垃圾”。的值0x88被符号扩展以打印为有符号的int,导致0xFFFFFF88打印输出。


推荐阅读