在iOS应用程序,我有一个结构,看起来像这样与结构对齐相关的EXC_BAD_ACCESS?
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
,但它非常奇怪。有没有人对这里发生的事情有任何了解?我只是通过填充结构或可以对齐真正导致访问不良(我认为对齐只对性能有影响,而不是正确性)来掩盖底层问题。
嘿比尔两件事。由于SO不允许我编辑一个字符,所以在calloc中出现错字。最后你错过了一个括号。 至于你的主要问题,这种事情通常会发生,如果你 要么buff在其他地方,或在你访问它的时间之一,你偶然脱离索引。 在尝试访问最后一个元素之前,您是否对* buff *进行了其他操作? – Lefteris 2012-02-13 03:46:53
再次检查您的宽度和高度的值... !!! – 2012-02-13 04:04:39
这是已经工作了几个月的代码 - 唯一的区别是我将CGFloat的结构成员的类型更改为带符号的字节。所以宽度和高度不是问题 - 这与结构的布局有关。 – Bill 2012-02-13 04:08:17