2011-07-03 27 views
3

我有一個非常簡單的C結構,像這樣:存儲C結構的C數組中的NSData

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元素,然後通過length告訴它有多少元素。我認爲這很好。

最後,另一方面,當解碼我的對象時,我會這樣做。

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

但我得到一個EXC_BAD_ACCESS在那一行,我不能弄清楚爲什麼。據我所知,文檔應該將NSData中的字節存儲到內存中的複製位置,然後使用receivedDynamicPlacesArrayPointer指向該blob。

這是完全可能的,我犯了一個錯誤,指針讓我絆倒,即使我認爲我理解他們。任何幫助將不勝感激。

回答

3

getBytes:length:docs say:「將接收方數據的起始字節數複製到給定的緩衝區中。」

因此,您將需要首先爲receivedDynamicPlacesArrayPointer自己分配內存。是你做的嗎?

換句話說,你會做這樣的:

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

啊,精彩紛呈。是的,我完全忽略了「進入緩衝區」的一部分。謝謝(當SO停止時,標記爲已解決並讓我選擇答案).. – jbrennan