Почему этот простой код вызывает EXC_BAD_ACCESS? - PullRequest
0 голосов
/ 06 марта 2012
#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 ]

3 голосов
/ 06 марта 2012

Правильный способ вернуть значение c - это getValue::

Node n;
[structValue getValue:&n];

pointerValue не возвращает указатель на сохраненное значение, он считывает значение указателя из памяти, в которой хранится Node (например, union { Node n; void* pointerValue; }).

2 голосов
/ 06 марта 2012

Если вы хотите добавить указатель и получить указатель, используйте вместо него NSValue *value = [NSValue valueWithPointer:&node];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...