c++ - 从堆中为数组分配地址

标签 c++ objective-c pointers struct

我想将结构的状态保存为二进制文件并再次加载它们。 我的结构如下所示:

typedef struct
{
  uint8_t pointerLength;
  uint8_t *pointer;
  uint8_t NumBla;
  uinT16 Bla[MAX_NUM_Bla];
   ...
}
BAR_STRUCT, *BAR;

typedef struct
{
  int numBar;
  BAR bars[MAX_NUM_BAR];
}
FOO_STRUCT, *FOO;

保存没问题,只是恢复状态。 我在文件中的字节串位于堆上并且指针指向该字符串的第一个地址的位置。 我这样做:

const void* dataPointer //points to adress in heap
unsigned char* bytePointer = (unsigned char*)dataPointer;

FOO foo = (FOO_STRUCT*)bytePointer;
bytePointer += sizeof(FOO_STRUCT);  

for (int i=0; i < MAX_NUM_BAR; i++) {
    foo->bars[i] = (BAR_STRUCT*)bytePointer;
}

最后的分配不起作用,我得到一个 EXC_BAD_ACCESS。
因为 bars 是一个指针数组,所以我需要更正每个元素指向的地址。因为它们不再有效。所以我尝试将我保存在字节流中的对象的地址分配给 foo->bars[i];
但我根本无法更改 foo->bars[i] 。访问有效,但分配新地址无效。
我想知道为什么。

编辑:
我在 OSX 上工作,所以我使用 NSData 将字节写入文件:

bool saveCurrentState( FOO foo){
  NSMutableData *data = [NSMutableData data];
  [data appendBytes:templates length:sizeof(FOO_STRUCT)];
  for (int i=0; i < MAX_NUM_BAR; i++){
    [data appendBytes:&foo->bar[i] length:sizeof(INT_BAR_STRUCT)];
    if( foo->bar[i] != NULL )
      [data appendBytes:foo->bar[i]->pointer length:sizeof(uint8_t)*foo->bar[i]->length];
    ...
  }
}

我无法真正更改结构,因为它们是在库中使用的,而我也没有真正的访问权限。我特别感兴趣的是为什么它没有按预期工作。 如您所见,我复制了整个结构,包括指针本身,并将指针指向的结构添加到字节字符串中。希望这能给出更多说明。

当读取字节流来设置结构时,我只需要用新地址更改数组的值,但由于某种原因不想工作。

编辑: 我还使用 NSData 保存/读取文件:

NSData* data = [NSData dataWithContentsOfFile:@"path/to/file"];
const void* dataPointer = [data bytes];

最佳答案

看起来你想要的是一个序列化库。尝试像 protocol buffers 这样的东西或 tpl (选择取决于您的确切需求,请查看文档)。

previous question似乎在涵盖某些问题方面做得不错。

关于c++ - 从堆中为数组分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523326/

相关文章:

c++ - 扩展编译器以在编译时评估 "complicated"函数(具有已知输入值),超出 `constexpr` 范围

c++ - 检测共享库中变量的重复定义

ios - Objective C Completion Block 导致 swift 崩溃

C - 将 X 长度的字符串拆分/存储到结构数组中

C++ boost.asio 服务器和客户端连接理解

c++ - 如何在c++中使用std::transform?

iphone - NSNumber 和 NSInteger 有什么区别?

ios - 如何使用自动布局防止 UIButton 超过其父 UIView 的宽度

c - 重用缓冲区指针_before_ free

c++ - operator->智能指针的返回值