C++ 指针运算 : alignment exception (0x801)

标签 c++ casting pointer-arithmetic

我遇到了一个非常奇怪的对齐异常,它只发生在某些硬件组合上。 我已经实现了一个蓝牙音频接收器,它从 unix 文件描述符获取数据。当我将 Macbook Pro(作为蓝牙源)和树莓派(作为蓝牙接收器)结合使用时,我在以下位置出现对齐异常:

void process(uint8_t* inData, uint32_t size, float* outData)
{
    int16_t* from = (int16_t*)inData;
    float* to = outData;

    for (size_t i = 0; i < size/2; ++i) {
        *to = *from/32767.0;
        ++to;
        ++from; // Crashes on MacbookPro/RasPi combination
    }
}

怎么来的?我的水槽显然不知道我的来源。这适用于其他平台(组合)吗?

我也试过这个片段,但是,也没有成功。

int8_t* from = (int8_t*)inData;
float* to = outData;

for (size_t i = 0; i < size/2; ++i) {
    int16_t tmp;
    std::memcpy(&tmp, from, 2);
    *to = tmp/32767.0;
    ++to;
    from += 2; // This crashes
}

我猜一个正在运行的例子在这里没有帮助,因为当使用另一个数据(蓝牙)源时,完全相同的代码可以工作。

最佳答案

您将指向 8 位值的指针视为指向 16 位值的指针。这是未定义的。

此外,通常情况下,8 位值将对齐 1 个字节,而 16 位值将对齐 2 个字节。

正如Eljay 在评论中所说,您可以更改inData 的对齐方式,但结果仍未定义。

关于C++ 指针运算 : alignment exception (0x801),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59127858/

相关文章:

c++ - 容器中需要显式移动构造函数吗?

c++ - 循环变量声明中的内存分配

c# - 将计算出的 double 转换为十进制可以纠正精度误差吗?

c - 它打印什么以及如何将其转换为指针算术?

c - 增加内存地址如何影响指针

arrays - 迭代 IMAGE_EXPORT_DIRECTORY 结构的 AddressOfNames 成员时出现问题

android - Mac Eclipse 不解析 NDK 中的 C++ lib 函数

C++ 迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格明智吗?

java - 如何处理 NamingEnumeration<SearchResult> 类型(Basic Java、LDAP)

c++ - 函数类型的模板对象