【问题标题】:Storing a C array of C structs in NSData在 NSData 中存储 C 结构的 C 数组
【发布时间】:2011-09-27 18:10:45
【问题描述】:

我有一个非常简单的 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 中的字节存储到内存中的一个复制位置,并使用 receivedDynamicPlacesArrayPointer 指向该 blob。

这完全有可能我犯了一个错误,即使我认为我理解它们,指针也会让我感到困惑。任何帮助将不胜感激。

【问题讨论】:

    标签: ios cocoa pointers struct nsdata


    【解决方案1】:

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

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

    换句话说,你会喜欢:

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

    【讨论】:

    • 啊,太棒了。是的,我完全忽略了“进入缓冲区”部分。谢谢(当 SO 不再愚蠢并让我选择答案时,将标记为已解决)..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多