我遇到了一个非常奇怪的对齐异常,它只发生在某些硬件组合上。 我已经实现了一个蓝牙音频接收器,它从 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/