2013-03-25 33 views
0

編輯: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步驟直到打印語句時,我得到正確的值:7,56,58,11,239

這是怎麼回事?我認爲問題在於返回指向結構體的指針和內存中的相關區域被覆蓋,但我不確定。我怎樣才能解決它,並仍然返回一個指針,而不是一個結構的副本?

+0

我認爲將絕對粘貼到您的'header'結構定義 – 2013-03-25 09:58:22

+0

將是有用的,我已經更新了一個鏈接到完整程序的要點的問題。我需要使用malloc()嗎?如果是這樣,我不能再使用'head = {...}'定義了,對嗎? :( – chrissphinx 2013-03-25 11:58:12

回答

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。

+0

謝謝!你知道爲什麼它在與lldb一起使用時工作嗎? – chrissphinx 2013-03-25 18:16:46

+0

好吧,最有可能的是堆棧上的內存地址還沒有被覆蓋,如前所述,在這種情況下,結果是不確定的,似乎是隨機的不排除適當的結果;) – 2013-03-25 20:08:29