c++ - c++ 中的 gcc 浮点指针转换导致 SIGBUS 错误

标签 c++ pointers gcc casting segmentation-fault

我有一个动态定义的无符号 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/

相关文章:

c++ - 指针和引用棘手的代码

c - 将void *转换为int并返回

c++ - 将函数指针传递给 C++ 中的成员函数。出现错误

linux - 为什么静态链接的可执行文件中会有全局偏移表和过程链接表?

c - 如何在编译时确定数组的长度?

c++ - 将 boost::chrono::steady_clock::time_point 转换为 std::chrono::steady_clock::time_point

取消引用指向结构 vector 的指针时的c++段错误

C:通过 void 指针然后强制转换实现平台独立性

C编程,scanf()函数

c++ - 识别 Windows 中连接的驱动器