在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