Dav*_*rea 6 c arrays struct microchip xc16
我有一个数组,每个数组的元素可以是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
Run Code Online (Sandbox Code Playgroud)
编译器应该分配4个字节而不是2个字节.
解决方法:如果我将结构更改为:
typedef union {
uint16_t u16; // As uint16_t
uint8_t u8[1]; // As uint8_t
} my_array_t;
Run Code Online (Sandbox Code Playgroud)
编译器应该分配2个字节,但这是不正确的:
my_array[0].u8[1] = 2;
Run Code Online (Sandbox Code Playgroud)
虽然它仍然有效:
uint8_t byte_1 = my_array[0].u8[1]; // Gets 0x02
Run Code Online (Sandbox Code Playgroud)
(除了调试器没有显示其值的不便之外).
问题:我应该接受解决方法,还是应该使用更好的解决方案?
请参考之前对此的讨论,其中提出了上述解决方案.
编辑.
根据EOF的建议(见下文),我检查了sizeof.
解决方法之前:
sizeof(my_array_t) // Is 4
sizeof(my_array[0]) // Is 4
sizeof(my_array[0].u8) // Is 2
Run Code Online (Sandbox Code Playgroud)
解决方法之后:
sizeof(my_array_t) // Is 2
sizeof(my_array[0]) // Is 2
sizeof(my_array[0].u8) // Is 2
Run Code Online (Sandbox Code Playgroud)
这表明它是一个编译器错误.
而不是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;
Run Code Online (Sandbox Code Playgroud)
XC16编译器为每个元素正确分配2个字节,调试器正确显示各个字节.
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |