Хранение массива C структур C в NSData - PullRequest
3 голосов
/ 04 июля 2011

У меня действительно простая структура C, например:

typedef struct {
    int tag;
    CGPoint position;
} Place;

То есть все скалярные типы и без указателей в структуре.

Тогда у меня есть массив таких точек:

 Place *dynamicPlaces = calloc(numberOfPlaces, sizeof(Place));

Таким образом, каждый элемент dynamicPlaces должен быть (если я что-то не перепутал ... это, конечно, возможно со мной и указателями ...) структурой типа Place, инициализированной со всеми ее членами 0, да? Пока все хорошо.

Затем я пытаюсь поместить этот массив в объект NSData для отправки по сети (вместе с количеством элементов, не показано):

NSData *placesData = [NSData dataWithBytes:dynamicPlaces length:(sizeof(Place) * numberOfPlaces)];

Я передаю ему массив напрямую, потому что, если память служит, указатель dynamicPlaces действительно указывает на первый элемент структуры массива, а затем я сообщаю ему, сколько элементов существует через length. Я думаю, что это хорошо.

Наконец, с другой стороны, я делаю это при декодировании моего объекта.

[receivedData getBytes:receivedDynamicPlacesArrayPointer length:[receivedData length]];

Но я получил EXC_BAD_ACCESS на этой линии, и я не могу понять, почему. Насколько я могу судить по документации, это должно хранить байты из NSData в скопированном месте в памяти и указывать на этот BLOB-объект с помощью receivedDynamicPlacesArrayPointer.

Вполне возможно, что я совершил ошибку, указатели сбивают меня с толку, хотя я думаю, что понимаю их. Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 04 июля 2011

getBytes: length: docs говорят: «Копирует количество байтов с начала данных получателя в заданный буфер.»

Поэтому вам нужно сначала выделить память для receiveDynamicPlacesArrayPointer самостоятельно.Вы сделали это?

Другими словами, вы бы хотели:

 Place* receivedDynamicPlacesArrayPointer = (Place*)malloc([receivedData length]);
...