你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

编译器在结构体中插入了并不存在的 16 位变量?

[复制链接]
patch1582 提问时间:2026-4-28 14:36 / 未解决

使用芯片STM32F407遇到了一个非常奇怪的结构体问题。 我定义了一个包含多个变量的结构体,理论总大小为 30 字节。但不知为何,sizeof(struct) 计算出来的结果却是 32 字节! typedef struct { uint32_t var1; // 0 int16_t var2; // 4 int16_t var3; // 6 int16_t var4; // 8 int16_t var5; // 10 uint8_t var6; // 12 uint8_t var7; // 13 uint16_t var8; // 14 int16_t var9; // 16 int16_t var10; // 18 int16_t var11; // 20 int16_t var12; // 22 int16_t var13; // 24 uint32_t var14; // 26 } data_structure;

data_structure my_data; memset (msg, 0, 64); sprintf (msg, "Size of my_data: %d\r\n", sizeof(my_data)); HAL_UART_Transmit(&huart6, msg, strlen(msg), 100); 串口输出结果:Size of my_data:32 经过测试,我发现真正的问题是:编译器在 var13 和 var14 之间插入了 2 字节的变量,导致我的 uint32_t var14 向后偏移了 2 个字节,但实在看不出问题在哪? 我是这样发现问题的:我写了一小段代码,按顺序给结构体的每个字节赋值,然后逐个打印内存中的每一个字节。 my_data.var1 = 0x04030201; my_data.var2 = 0x0605; my_data.var3 = 0x0807; my_data.var4 = 0x1009; my_data.var5 = 0x1211; my_data.var6 = 0x13; my_data.var7 = 0x14; my_data.var8 = 0x1615; my_data.var9 = 0x1817; my_data.var10 = 0x2019; my_data.var11 = 0x2221; my_data.var12 = 0x2423; my_data.var13 = 0x2625; my_data.var14 = 0x30292827;

memset (msg, 0, 32); sprintf (msg, "Size of my_data: %d\r\n", sizeof(outpc)); HAL_UART_Transmit(&huart6, msg, strlen(msg), 100);

p = (char *)&my_data;

for (i = 0; i < sizeof(my_data); i++) { buffer[i] = *(p+i);

memset (msg, 0, 32); sprintf (msg, "%i: 0x%02X\r\n", i+1, *(p+i));

HAL_UART_Transmit(&huart6, msg, strlen(msg), HAL_MAX_DELAY); } 下面是输出结果:第 27、28 个字节根本不应该存在! plaintext 结构体大小:32 1: 0x01 2: 0x02 3: 0x03 4: 0x04 5: 0x05 6: 0x06 7: 0x07 8: 0x08 9: 0x09 10: 0x10 11: 0x11 12: 0x12 13: 0x13 14: 0x14 15: 0x15 16: 0x16 17: 0x17 18: 0x18 19: 0x19 20: 0x20 21: 0x21 22: 0x22 23: 0x23 24: 0x24 25: 0x25 26: 0x26 27: 0x78 28: 0x56 29: 0x27 30: 0x28 31: 0x29 32: 0x30

收藏 评论0 发布时间:2026-4-28 14:36

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版