wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个数组,每个数组的元素可以是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_
我有一个数组,每个数组的元素可以是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个字节,但这是不正确的:

@H_231_19@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个字节,调试器正确显示各个字节.

大佬总结

以上是大佬教程为你收集整理的如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍全部内容,希望文章能够帮你解决如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。