0

编辑: 这是程序的要点

我对此完全感到困惑,这是我的主要程序:

    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 直到打印语句时,我得到正确的值:7、56、58、11、239

这里发生了什么?我认为问题在于返回指向结构的指针和被覆盖的内存中的相关区域,但我不确定。我该如何解决它并且仍然继续返回指针而不是结构的副本?

4

1 回答 1

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;

原因是您将引用分配给仅存在于方法范围内的局部变量。在外面它将返回未定义。

于 2013-03-25T12:32:54.190 回答