5

アプリケーションで 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];
}
4

2 に答える 2

2

シリアル化するには、構造体または適切なものを使用する必要があります...それができない場合は、少なくとも32ビットと16ビットのポインターが16または32ビットのメモリアドレスに整列していることを確認してください。

*(int *foo)0x800002 (または 1) は、おそらくひどく終了します。一部のプロセッサには、アラインされていないメモリ アドレスを緩める機能がありますが、これはサイクルの無駄であり、これを実行しようとすると (当然のことながら) クラッシュするプロセッサもあります。クラッシュしない場合は、複数のメモリ アクセスを実行してから、それらを組み合わせてアライメントされていないアドレスを作成しています。

于 2013-04-10T13:54:06.617 に答える