如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍
发布时间:2020-12-14 01:50:50 所属栏目:Windows 来源:网络整理
导读:我有一个数组,每个数组的元素可以是uint16_t或一对uint8_t. 它的元素被定义为uint16_t和2 uint8_t的子数组的并集. 不幸的是,编译器(MicroChip XC16)分配的内存量应该是阵列的两倍. typedef union { uint16_t u16; // As uint16_t uint8_t u8[2]; // As uint8
我有一个数组,每个数组的元素可以是uint16_t或一对uint8_t.
它的元素被定义为uint16_t和2 uint8_t的子数组的并集. 不幸的是,编译器(MicroChip XC16)分配的内存量应该是阵列的两倍. typedef union { uint16_t u16; // As uint16_t uint8_t u8[2]; // As uint8_t } my_array_t; my_array_t my_array[1]; // 1 word array,for testing my_array[0].u8[0] = 1; my_array[0].u8[1] = 2; uint8_t byte_0 = my_array[0].u8[0]; // Gets 0x01 uint8_t byte_1 = my_array[0].u8[1]; // Gets 0x02 uint16_t byte_0 = my_array[0].u16; // Gets 0x0201 编译器应该分配4个字节而不是2个字节. 解决方法:如果我将结构更改为: typedef union { uint16_t u16; // As uint16_t uint8_t u8[1]; // As uint8_t } my_array_t; 编译器应该分配2个字节,但这是不正确的: my_array[0].u8[1] = 2; 虽然它仍然有效: uint8_t byte_1 = my_array[0].u8[1]; // Gets 0x02 (除了调试器没有显示其值的不便之外). 问题:我应该接受解决方法,还是应该使用更好的解决方案? 请参考previous discussion on this,其中建议使用上述解决方案. 编辑. 根据EOF的建议(见下文),我检查了sizeof. 解决方法之前: sizeof(my_array_t) // Is 4 sizeof(my_array[0]) // Is 4 sizeof(my_array[0].u8) // Is 2 解决方法之后: sizeof(my_array_t) // Is 2 sizeof(my_array[0]) // Is 2 sizeof(my_array[0].u8) // Is 2 这表明它是一个编译器错误.
而不是2个字节的数组,使用2字节的结构:
// Two bytes in a 16-bit word typedef struct{ uint8_t lsb; // As uint8_t,LSB uint8_t msb; // As uint8_t. MSB } two_bytes_t; typedef union { uint16_t u16; // As uint16_t two_bytes_t u8x2; // As 2 each of uint8_t } my_array_t; my_array_t my_array[1]; // 1 word array,for testing my_array[0].u8x2.msb = 1; my_array[0].u8x2.lsb = 2; XC16编译器为每个元素正确分配2个字节,调试器正确显示各个字节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- windows-phone-7 – 如何通过浏览器网址启动Wind
- windows-server-2008 – 什么取代了Windows Serv
- windows-server-2008 – Windows 2008的邮件服务
- (二) Windows 进行 Docker CE 安装(Docker Deskt
- 与Windows 10的初始RDP连接缓慢
- wpf – Snoop没有看到我的应用程序的子窗口
- windows-server-2008 – TeamCity在Windows机器上
- windows-server-2008 – 为Windows 7部署构建uEF
- 在Windows上删除C中的权限
- Windows Phone – 在实际设备上测试Windows Phon
热点阅读