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を実行すると、printステートメントが正しい値になります: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 に答える