En una aplicación iOS, tengo una estructura que tiene este aspectoEXC_BAD_ACCESS relacionado con la alineación de estructuras?
typedef struct _Pixel {
signed char r;
signed char g;
signed char b;
} Pixel;
En mi código, asignar una matriz de estos con calloc:
Pixel* buff = calloc(width * height, sizeof(Pixel));
Ahora bien, esto funciona a la perfección en el simulador , pero en el dispositivo, si intento acceder al buff[width * height - 1]
(es decir, el último elemento en buff
), obtengo un EXC_BAD_ACCESS
.
Esto no tiene sentido para mí, así que después de unas horas de depuración, me preguntó si había algún tipo de problema de alineación, por lo que en un capricho Traté:
typedef struct _Pixel {
signed char r;
signed char g;
signed char b;
signed char padding;
} Pixel;
haciendo que el tamaño de Pixel una potencia de dos.
Esto corrige el EXC_BAD_ACCESS
, pero es terriblemente extraño. ¿Alguien tiene alguna idea de lo que está pasando aquí? ¿Estoy enmascarando el problema subyacente rellenando la estructura o alineamiento de la lata que realmente causa un mal acceso (pensé que la alineación solo tenía un efecto en el rendimiento, no en la corrección).
Hola Bill dos cosas. Como SO no me permite editar un personaje, tienes un error tipográfico en calloc. Le falta un paréntesis al final. En cuanto a su problema principal, este tipo de cosas generalmente ocurre si reasigna el buff en otro lugar, o en una de las veces que accede, accidentalmente se sale del índice. ¿Haces algo más para * buff * antes de intentar acceder al último elemento? – Lefteris
verifique nuevamente sus valores de ancho y alto ... !!! –
Este es el código que funcionó durante meses; la única diferencia es que cambié el tipo de los miembros de la estructura de CGFloat a bytes firmados. Entonces, el ancho y la altura no son el problema, es algo que tiene que ver con el diseño de la estructura. – Bill