|
使用芯片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 |
当程序里有 while (1) 死循环时,main 函数还需要 return 0 吗?
FreeRTOS中为什么要以这种宏定义方式访问指定地址的值
给变量赋值二进制数值无效
STM32CubeIDE 构建后运行脚本与路径中包含引号
int 与 float 之间的转换
有关STM32H743ZGT6 驱动RTL8201F-VB芯片驱动的问题,有奖寻求帮助
STM32F769I-DISCO开发包LCD DSI示例程序如何回读LCD 驱动IC的寄存器?
stm32使用hal库数据疑问
在学习stm32,有哪些视频教程呢?想系统研究研究
stm32G030C8T6 官方例程库
微信公众号
手机版