为什么这个简单的代码导致EXC_BAD_ACCESS?

时间:2012-03-06 14:08:12

标签: objective-c struct exc-bad-access

#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);,但为什么?

2 个答案:

答案 0 :(得分:3)

获得c值的正确方法是getValue:

Node n;
[structValue getValue:&n];

pointerValue不返回指向存储值的指针,它从存储Node的内存中读取指针值(如union { Node n; void* pointerValue; })。

答案 1 :(得分:2)

如果要添加指针并接收指针,请改为使用NSValue *value = [NSValue valueWithPointer:&node];