EXC_ARM_DA_ALIGN崩溃

时间:2013-04-10 12:02:42

标签: iphone objective-c crash memory-alignment

我的应用程序中出现EXC_ARM_DA_ALIGN崩溃。这是Xcode标记为“恶意”的代码。在模拟器上我没有这个崩溃,只在设备上,所以我认为这是一个内存对齐问题。 有谁知道如何修复此代码? 非常感谢你。

-(int) Save:(void*) pBuf {

int nNeedSize = sizeof(fType) + sizeof(sizeBrush) + sizeof(nBrushType) + sizeof(rcImage) + sizeof(count) + sizeof(data[0]) * count;

if (pBuf == nil)
return nNeedSize;

*(NSInteger*)pBuf = count; pBuf += sizeof(count);
*(BOOL*)pBuf = fType; pBuf += sizeof(fType);
(*(CGSize*)pBuf).width = sizeBrush.width;
(*(CGSize*)pBuf).height = sizeBrush.height;
pBuf += sizeof(sizeBrush);
*(NSInteger*)pBuf = nBrushType; pBuf += sizeof(nBrushType);
(*(CGRect*)pBuf).size.width = rcImage.size.width; 
(*(CGRect*)pBuf).size.height = rcImage.size.height; 
(*(CGRect*)pBuf).origin.x = rcImage.origin.x; 
(*(CGRect*)pBuf).origin.y = rcImage.origin.y; 
pBuf += sizeof(rcImage);

for (int i = 0; i < count; i++)
{
    (*(CGPoint*)pBuf).x = data[i].x;
    (*(CGPoint*)pBuf).y = data[i].y;
    pBuf += sizeof(data[0]);
}

return nNeedSize;}

这是另一个标记为恶性的部分:

int i;
int nTotalSize = 0;
for (i = 0; i < m_Data.count; i++)
{
    maskStroke* one = [m_Data objectAtIndex:i];
    nTotalSize += [one Save:NULL];
}

unsigned char* buf = (unsigned char*)malloc(nTotalSize+100);
unsigned char* cur_ptr = buf;
for (i = 0; i < m_Data.count; i++)
{
    maskStroke* one = [m_Data objectAtIndex:i];
    cur_ptr += [one Save:cur_ptr];
}

2 个答案:

答案 0 :(得分:2)

你应该使用一个结构或一些合理的序列化...如果你不能这样做,至少要确保你的32位和16位指针与16或32位内存地址对齐。

*(int * foo)0x800002(或1)可能会很糟糕地结束。某些处理器具有解除未对齐内存地址的功能,但是当您尝试执行此操作时,它会浪费周期而其他处理器(正确地)会崩溃。如果它没有崩溃,它会进行多次内存访问,然后将它们组合起来创建未对齐的地址。

答案 1 :(得分:0)

您必须确保您的pBuf指针与sizeof(CGPoint)对齐,表示指针%sizeof(CGPoint)== 0