类型惩罚指针挑战

时间:2017-01-23 14:27:31

标签: c++ pointers type-punning

所以我在这里对RF24Network库提出了一些挑战:https://github.com/TMRh20/RF24Network

我修改了这个库,我正在尝试让它运行在Teensy 3.5上,这是ARM和32位而不是AVR 8位,直到现在我都在使用它。

此:

RF24NetworkHeader *header = (RF24NetworkHeader*)(&frame_buffer);

我的理解是非法的,但适用于Atmegas(328p / 2560)。在Teensy上,这在我修改的库版本中崩溃了(我想因为我改变了RF24NetworkHeader结构的大小)。

在下面的代码行中我读取并操作了Header(因此是frame_buffer,因为" header"是指向frame_buffer的指针)。然后,Frame_buffer正在被重用,因为它是一个全局变量。

我首先创建了一个新的RF24NetworkHeader对象,然后在那里复制了Frame_buffer的内容,然后创建了一个新的指针:

RF24NetworkHeader hdr;
memcpy(&hdr, frame_buffer, sizeof(RF24NetworkHeader));
RF24NetworkHeader *header;
header = &hdr;

但是我忘了将Header复制回Frame_buffer,因为在其他函数中进一步处理了Frame_buffer的内容。

RF24NetworkHeader是由uint16_tunsigned chars和一个固定大小的unsigned char数组组成的结构。

有没有办法正确访问frame_buffer,好像它是RF24NetworkHeader而不违反严格的别名规则? 我读到联盟的C ++方法大部分时间都可以工作,但也是非法的。

谢谢!

0 个答案:

没有答案