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

标签 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 实际上指向数组的第一个结构元素,然后我告诉它有多少元素通过长度。我认为这很好。

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

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

但我在该行收到了一个 EXC_BAD_ACCESS,我不太明白为什么。据我从文档中得知,这应该是将 NSData 中的字节存储到内存中复制的位置,并使用 receivedDynamicPlacesArrayPointer 指向该 blob。

这完全有可能是我在做这件事时犯了一个错误,尽管我认为我理解它们,但指针却把我绊倒了。任何帮助将不胜感激。

最佳答案

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

因此您需要先自己为 receivedDynamicPlacesArrayPointer 分配内存。你这样做了吗?

换句话说,你会喜欢:

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

关于ios - 在 NSData 中存储 C 结构的 C 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6565223/

相关文章:

ios - 在 Stripe iOS 支付屏幕中隐藏 "Save for use in other apps"切换

cocoa - 将 (u)int64_t 转换为 NSNumber

objective-c - 另一个 "Retain, then Release"问题

c - 需要帮助理解 char 和 int 指针

将复杂类型指针复制到 C 中的另一个指针

c - 将数组移交给函数。指针的正确使用?

android - Cordova 和 Angular : plugins not working

ios - NSPredicate 在 NSSet 中查找具有属性的对象

objective-c - NSData转换为NSString吗?

cocoa - 是否有适用于 Windows 的 Cocoa 框架或像 Mac 中那样的适用于 Windows 的界面构建器?