Trong một ứng dụng iOS, tôi có một cấu trúc trông như thế nàyEXC_BAD_ACCESS liên quan đến sắp xếp cấu trúc?
typedef struct _Pixel {
signed char r;
signed char g;
signed char b;
} Pixel;
Trong mã của tôi, tôi bố trí một mảng của những việc này với calloc:
Pixel* buff = calloc(width * height, sizeof(Pixel));
Bây giờ, điều này hoạt động hoàn hảo trong mô phỏng , nhưng trên thiết bị, nếu tôi cố gắng truy cập buff[width * height - 1]
(tức là phần tử cuối cùng trong buff
), tôi nhận được EXC_BAD_ACCESS
.
này không có ý nghĩa đối với tôi, vì vậy sau một vài giờ gỡ lỗi, tôi tự hỏi nếu nó là một số loại vấn đề liên kết, vì vậy trên một whim tôi đã cố gắng:
typedef struct _Pixel {
signed char r;
signed char g;
signed char b;
signed char padding;
} Pixel;
làm cho kích thước của Pixel một sức mạnh của hai.
Điều này sửa lỗi EXC_BAD_ACCESS
, nhưng điều đó thật kỳ lạ. Có ai có bất kỳ cái nhìn sâu sắc vào những gì đang xảy ra ở đây? Tôi chỉ cần che giấu các vấn đề cơ bản bằng cách đệm cấu trúc hoặc có thể liên kết thực sự gây ra một truy cập xấu (tôi nghĩ sự liên kết chỉ có ảnh hưởng đến hiệu suất, không đúng).
Xin chào Bill hai điều. Vì SO không cho phép tôi chỉnh sửa một ký tự, bạn có một lỗi đánh máy trong calloc. Bạn đang thiếu một dấu ngoặc đơn ở cuối. Đối với vấn đề chính của bạn, loại sự việc này thường xảy ra nếu bạn Hoặc thực hiện buff ở một nơi khác, hoặc trong một lần bạn truy cập nó, bạn tình cờ vô tình tắt chỉ mục. Bạn có làm gì khác để * buff * trước khi cố gắng truy cập phần tử cuối cùng không? – Lefteris
kiểm tra giá trị chiều rộng và chiều cao của bạn một lần nữa ... !!! –
Đây là mã đã hoạt động trong nhiều tháng - khác biệt duy nhất là tôi đã thay đổi loại thành viên cấu trúc từ CGFloat thành các byte đã ký. Vì vậy, chiều rộng và chiều cao không phải là vấn đề - đó là một cái gì đó để làm với bố trí của cấu trúc. – Bill