В приложении 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
, но это ужасно странно. Кто-нибудь знает, что здесь происходит? Я просто маскирую основную проблему, заполняя структуру, или выравнивание действительно может вызвать плохой доступ (я думал, что выравнивание влияет только на производительность, а не на правильность).