EXC_BAD_ACCESS, связанный с выравниванием структуры?

В приложении iOS у меня есть структура, которая выглядит примерно так

typedef struct _Pixel {
  signed char r;
  signed char g;
  signed char b;
} Pixel;

В моем коде я выделяю их массив с помощью calloc:

Pixel* buff = calloc(width * height, sizeof(Pixel));

Теперь это отлично работает в симуляторе, но на устройстве, если я попытаюсь получить доступ к buff [width * height - 1] (т.е. последний элемент в buff ), я получите EXC_BAD_ACCESS .

Это не имело для меня смысла, поэтому после нескольких часов отладки я подумал, не связана ли это с какой-то проблемой с выравниванием, поэтому по своей прихоти я попытался:

typedef struct _Pixel {
  signed char r;
  signed char g;
  signed char b;
  signed char padding;
} Pixel;

сделать размер пикселя степенью двойки. .

Это исправляет EXC_BAD_ACCESS , но это ужасно странно. Кто-нибудь знает, что здесь происходит? Я просто маскирую основную проблему, заполняя структуру, или выравнивание действительно может вызвать плохой доступ (я думал, что выравнивание влияет только на производительность, а не на правильность).

5
задан Bill 13 February 2012 в 03:50
поделиться