C ++指针算法:对齐异常(0x801)

问题描述 投票:0回答:1

我有一个非常奇怪的对齐异常,仅在某些硬件组合上才会发生。我已经实现了一个蓝牙音频接收器,该音频接收器的数据从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
}

我猜正在运行的示例在这里无济于事,因为当使用其他数据(蓝牙)源时,完全相同的代码可以工作。

c++ casting pointer-arithmetic
1个回答
0
投票

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

此外,8位值的对齐方式为1个字节,而16位值的对齐方式为2个字节。

© www.soinside.com 2019 - 2024. All rights reserved.