|
使用芯片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 |
中断服务程序抖动
STM32L562DK探索板——如何启用蓝牙功能?
自己写驱动深入学习与调用Hal库的取舍
关于最近学习C语言回调和钩子函数的想法,以及对HAL库回调函数的困惑
STM32 上同时跑 LWIP 的 TCP 与 UDP 连接
使用 HAL 库通过串口以 ASCII 形式发送整型数据
USB Host 外部中断按键失效
调用HAL_FLASH_OB_Unlock()直接进入 HardFaultHandler
STM32 增加 WiFi + 以太网的低成本方案
NUCLEO G474RE无法运行程序
微信公众号
手机版
应该是内存分配按照32位进行处理的,结构体定义时必须为4的倍数。在data_structure前增加attribute((packed)),取消结构体成员的自动字节对齐。
应该是 字节对齐 导致的
了解一下
[md]非常感谢,按照您的方法解决了