编辑: Here is该计划的要点
我对此感到困惑,这是我的主要计划:
NSString* binPath = [NSHomeDirectory() stringByAppendingString:@"/Documents/BPlusTree/BinaryCodeIndex.bin"];
CMCodeIndex* index = [[CMCodeIndex alloc] initWithFile:binPath];
header* h = [index header];
NSLog(@"%hd, %hd, %hd, %hd, %hd", h->m, h->r, h->e, h->f, h->k);
所有CMCodeIndex类都从二进制文件中读取5个短值。它存储在类中的结构中。然后我得到一个指向结构的指针并打印出值。
如果我正常运行程序,我会收到意外的输出:27728,29557,29268,25957,26157
不是标题值。但是当我在第header* h = [index header];
行中断并用lldb步骤直到print语句我得到正确的值时:7,56,58,11,239
这里发生了什么?我认为问题在于返回一个指向结构的指针,并且内存中的相关区域被覆盖,但我不确定。我怎样才能解决它并仍然继续返回指针而不是结构的副本?
答案 0 :(得分:1)
如你所料,你应该使用malloc,你的代码就像这样:
header *head=(header*)malloc(sizeof(header));
head->m=( *(short*)[[binHandle readDataOfLength:2] bytes] );
head->f=( *(short*)[[binHandle readDataOfLength:2] bytes] );
head->k=( *(short*)[[binHandle readDataOfLength:2] bytes] );
head->r=( *(short*)[[binHandle readDataOfLength:2] bytes] );
head->e=( *(short*)[[binHandle readDataOfLength:2] bytes] );
h = head;
原因是您分配了对局部变量的引用,该局部变量仅存在于方法范围中。在外面它将返回undefined。