C++指针算术:对齐异常 (0x801)
C++ pointer arithmetic: alignment exception (0x801)
我得到了一个非常奇怪的对齐异常,它只发生在某些硬件组合上。 我已经实现了一个蓝牙音频接收器,它从 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
的对齐方式,但结果仍未定义。
这修复了它:
char* to; // = ...
char* from; // = ...
for (size_t i = 0; i < buffer.size()/size(conf.codec); ++i) {
int16_t tmp;
std::memcpy(&tmp, from+(i*2), 2);
float f = tmp/32767.0;
std::memcpy(to+(i*4), &f, 4);
}
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- C++指针算术:对齐异常 (0x801)