在NSData中存储C结构的C数组

时间:2011-07-03 20:00:27

标签: ios cocoa pointers struct nsdata

我有一个非常简单的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实际上是指向数组的第一个struct元素,然后我通过{{1告诉它有多少个元素}}。我认为这很好。

最后,另一方面,我在解码对象时这样做。

length

但是我在那条线上得到[receivedData getBytes:receivedDynamicPlacesArrayPointer length:[receivedData length]]; ,我无法弄明白为什么。据文档所知,这应该是将NSData中的字节存储到内存中的复制位置,并使用EXC_BAD_ACCESS指向该blob。

完全有可能我犯了这个错误,指针绊倒了我,即使我认为我理解它们。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

getBytes:length:docs说:“将接收者数据开头的一些字节复制到给定的缓冲区中。”

所以你需要先自己为receivedDynamicPlacesArrayPointer分配内存。你做到了吗?

换句话说,你会这样做:

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