2012-03-06 21 views
0
#import <Foundation/Foundation.h> 

typedef struct Node { 
    int offset; 
} Node; 

int main (int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSMutableArray *array = [[NSMutableArray alloc] init]; 
     Node node = {111111}; 
     NSValue *value = [NSValue value:&node withObjCType:@encode(Node)]; 
     [array addObject:value]; 

     NSValue *structValue = [array objectAtIndex:0]; 
     Node *n = (Node *)[structValue pointerValue]; 

     printf("offset: %d", n->offset); 
    } 
    return 0; 
} 

この行でコードがクラッシュします:printf("offset: %d", n->offset);ですが、なぜですか?なぜこの単純なコードがEXC_BAD_ACCESSを引き起こすのですか?

+0

printf行の前に 'n'の内容を調べるとどうなりますか? –

+0

'n> offset'にアクセスできませんでしたが、' printf( "%d"、n) 'は' 111111'を出力します。しかし、 'Node'構造体に別のフィールドを追加すると、' printf( "%d"、n) 'は最初のフィールドの値だけを出力します。 – neevek

答えて

3

バックC値を取得するための正しい方法はgetValue:ある:

Node n; 
[structValue getValue:&n]; 

pointerValueは、格納された値へのポインタを返さない、それはNodeが(union { Node n; void* pointerValue; }ように)格納されているメモリからのポインタ値を読み出します。

+0

ありがとう、それは働いた! – neevek

2

ポインタを追加してポインタを受け取る場合は、代わりにNSValue *value = [NSValue valueWithPointer:&node];を使用します。

関連する問題