我有一个动态定义的无符号 8 位整数数组:
const uint8_t *data;
这包含一个字节流,并被重新解释为各种数据类型。我可以通过以下方式将此数据流中的位置 n 重新解释为基本类型 type:
type value = *((type*) &data[n]);
这适用于在 Windows 下使用 Visual Studio 编译器的所有数据类型,但是在 Linux 下使用 gcc 编译时,当 type 是 float (取消引用的位置在数据数组的范围)。进一步调查表明,是指针取消引用导致了此错误。我已经通过使用 memcpy 解决了这个问题,但想知道为什么这首先会导致问题,因为引用的地址是有效的。 reinterpret_cast 会更合适吗?如果是,为什么?
编辑:
我没有提到Linux系统有ARM架构。 @MSalters 在下面指出,对于不同的配置,可能会有更严格的指针对齐要求。一项简短的研究表明,虽然上述内容在 x86 架构上有效(尽管 C/C++ 标准不允许),但在 ARM 上取消引用未对齐的指针会导致总线错误。
最佳答案
Actor 确实是个问题。它已经是一个 reinterpret_cast
,即使您使用的是旧的 C 语法。但仅当 &data[n]
实际上是有效的 float*
时才允许转换。 SIGBUS
表示不是。该地址可能是一个有效的 char*
地址,但这并不意味着它是一个有效的 float*
地址。特别是,float*
可能有更严格的对齐要求。
关于c++ - c++ 中的 gcc 浮点指针转换导致 SIGBUS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158510/