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

时间:2014-10-02 10:00:56

标签: c++ pointers gcc casting segmentation-fault

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

const uint8_t *data;

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

type value =  *((type*) &data[n]);

这适用于在Windows下使用Visual Studio编译器的所有数据类型,但是当使用gcc在Linux下编译时,当 type 是一个浮点数时,这会产生一个SIGBUS错误(取消引用的位置在数据数组的范围)。进一步的调查表明,引用此错误的是指针解除引用。我已经通过使用memcpy解决了这个问题,但是想知道为什么这会导致问题,因为引用的地址是有效的。 reinterpret_cast会更合适,如果是,为什么?

编辑:

我没有提到Linux系统有ARM架构。 @MSalters在下面指出,差异配置可能有更严格的指针对齐要求。一项简短的研究表明,虽然上述内容在x86架构上有效(尽管C / C ++标准不允许),但ARM上的未对齐指针解除引用会导致总线错误。

2 个答案:

答案 0 :(得分:5)

演员确实是个问题。即使您使用旧的C语法,它已经是reinterpret_cast。但只有在&data[n]实际上是有效float*时才允许强制转换。 SIGBUS表示不是。地址可能是有效的char*地址,但这并不意味着它是有效的float*地址。特别是,float*可能具有更严格的对齐要求。

答案 1 :(得分:1)

正如MSalters在这个帖子中提到的,强制类型转换的目标类型的对齐要求比源类型的对齐要求更强,这会导致{I}处理不处理未对齐访问的CPU。

处理这个问题的方法是SIGBUS

memcpy