C++ gcc浮点指针在C+中的转换+;导致SIGBUS错误

C++ gcc浮点指针在C+中的转换+;导致SIGBUS错误,c++,pointers,gcc,casting,segmentation-fault,C++,Pointers,Gcc,Casting,Segmentation Fault,我有一个动态定义的无符号8位整数数组: const uint8_t *data; 它包含一个ByTestStream,并被重新解释为各种数据类型。我可以通过以下方式将此数据流中的位置n重新解释为基本类型: 这适用于在Windows下使用Visual Studio编译器的所有数据类型,但是,在Linux下使用gcc进行编译时,如果类型为浮点(取消引用的位置在数据数组的范围内),则会创建SIGBUS错误。进一步的调查表明,正是指针解引用导致了此错误。我已经通过使用memcpy解决了这个问题,但我想

我有一个动态定义的无符号8位整数数组:

const uint8_t *data;
它包含一个ByTestStream,并被重新解释为各种数据类型。我可以通过以下方式将此数据流中的位置n重新解释为基本类型:

这适用于在Windows下使用Visual Studio编译器的所有数据类型,但是,在Linux下使用gcc进行编译时,如果类型为浮点(取消引用的位置在数据数组的范围内),则会创建SIGBUS错误。进一步的调查表明,正是指针解引用导致了此错误。我已经通过使用memcpy解决了这个问题,但我想知道,既然引用的地址是有效的,那么为什么首先会出现问题。重新诠释演员阵容是否更合适?如果是,原因是什么

编辑:


我没有提到Linux系统有ARM架构@MSalters在下面指出,对于不同的配置,可能会有更严格的指针对齐要求。一个简短的研究表明,虽然上面的X86体系结构是有效的(虽然不允许C/C++标准),但是ARM上未对齐的指针撤销会导致总线错误。尽管您使用了旧的C语法,但它已经是一个
重新解释\u cast
。但是只有当
&data[n]
实际上是一个有效的
float*
时,才允许强制转换<代码>SIGBUS表示它不是。地址可能是有效的
char*
地址,但这并不意味着它是有效的
float*
地址。特别是,
float*
可能有更严格的对齐要求

正如MSalters在本线程中提到的,强制转换的目标类型的对齐要求比源类型的对齐要求更高,这会导致不处理未对齐访问的CPU上出现
SIGBUS

处理这个问题的方法是
memcpy

const uint8_t *data = ...;
type value;
memcpy(&value, data, sizeof value);

如果你正在做这项运动,我会考虑另一种设计,它只发生在漂浮物上吗?或者对于与float大小相同的其他类型?该设计适用于允许通过rs232接口进行通信的网络协议,以及位于tcp/ip之上的一些协议。数据类型是在帧头中定义的,因此需要这种解释。@Hampycalc-我对此表示怀疑。您只需要序列化和反序列化数据。“这适用于所有数据类型…”嗯,它正好满足您的需要。我不会真的把它形容为“很好”。是的,谢谢。我没有提到Linux系统是基于ARM的,而Windows系统是x86/x86_64。我以前在对齐需求方面没有遇到过问题,但我的经验仅限于x86CPU体系结构。将来我会坚持使用memcpy来保持代码的完全可移植性。好吧,x86对对齐错误也不满意,但代价是速度减慢。这一点值得一提!ARM对对齐非常挑剔,你可以在x86上逃脱谋杀。是的,非常有用的东西。我猜std::memcpy()将是最好的解决方案?这非常安全,是的。
const uint8_t *data = ...;
type value;
memcpy(&value, data, sizeof value);