c - 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 数组(如果相关)。
解决方案
您的代码依赖于实现定义的行为,因此在不知道运行它的系统的细节的情况下无法预测您将看到的内容:
- 的大小
struct ztest
可能包括填充 char
可以签名或未签名- 的字节
uint16_t
可以以大端或小端形式存储
似乎您的系统向 s 添加了一个字节的填充struct ztest
,使用带符号char
的 s,并将uint16_t
最高有效字节存储在较低的地址。
的值0x17
是填充字节中的“垃圾”。的值0x88
被符号扩展以打印为有符号的int
,导致0xFFFFFF88
打印输出。
推荐阅读
- java - 无法使用 xpath、id、名称或 css 选择器找到按钮或链接
- json - Dart 的解析问题 - [无构建值 ^ 可序列化 ^ ]
- uwp - 如何使用多个预编译头文件;一些来自图书馆
- mysql - Mysql join 从结果中删除重复项而不使用 group by
- python - 根据索引连接列之间的元素
- python - 拥有一个最多包含 5 个项目的博客
- c# - 如何在主窗口中动态加载两个页面
- javascript - 用 momentjs 显示 GMT 时间
- html - 如何在不使用背景位置的情况下为线性渐变设置动画?
- c++ - 为什么 stoi/atoi 会为我提供编译器错误?