c语言中uint 16_t,c - 如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍 - 堆栈内存溢出...

博客讨论了在MicroChip XC16编译器中遇到的问题,即数组内的union元素导致内存分配超出预期。作者发现编译器为union分配了4个字节,而实际需要的是2个字节。通过更改union定义,将uint8_t数组大小从2改为1,解决了内存分配问题,但带来了其他不便。经过sizeof检查,确认是编译器错误。
摘要由CSDN通过智能技术生成

我有一个数组,每个数组的元素可以是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

(除了调试器没有显示其值的不便之外)。

问题:我应该接受解决方法,还是应该使用更好的解决方案?

请参考之前对此的讨论 ,其中提出了上述解决方案。

编辑。

根据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

这表明它是一个编译器错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值