2012-03-13 2 views
1

Я заявляю о своей структуры в заголовочном файле следующим образом:присваивают значения Obj-C структуры из C

typedef struct MyStruct{ 
    int test; 
} MyStruct; 

@interface StructTestingFile 
MyStruct *originalStruct; 
@end 

Затем из файла .mm, я называю

originalStruct = loadTestInt(); 

В файле C , вот что я делаю:

extern "C" MyStruct* loadTestInt() 
{ 
    MyStruct *aStruct; 

    aStruct->test = 1; 

    return aStruct; 
} 

Каждый раз, когда он выходит из строя по назначению aStruct->test = 1. Что я делаю неправильно?

+0

Я думаю, это потому, что вы не выделять мою структуру. Эта первая строка в файле C создает, которая имеет значение null, тогда вы пытаетесь присвоить значение null, чтобы вы столкнулись с NullPointerException или что-то в этом роде. Попробуйте вызвать malloc в этой первой строке. – evanmcdonnal

ответ

4

Вы создаете указатель, но не выделять память для самой структуры;

MyStruct *aStruct; 

aStruct = (MyStruct*)malloc(sizeof(MyStruct)); 

aStruct->test = 1; 
+0

Это имеет смысл и отвечает на мой вопрос. Однако я получаю сообщение об ошибке «Невозможно инициализировать переменную типа« MyStruct * »с rvalue типа« void * »'? Есть идеи? –

+0

Попробуйте выполнить кастинг: 'aStruct = (MyStruct *) malloc (sizeof (MyStruct));' – UIAdam

+0

@karl_ Извините, обновил ответ, вам нужно будет придать результат malloc правильному типу. –

2

Вызов неинициализированного указателя вызывает неопределенное поведение. aStruct не указывает на что-либо, когда вы выполняете это задание. Выделяют некоторое пространство, и вы будете прочь к гонкам:

extern "C" MyStruct* loadTestInt() 
{ 
    MyStruct *aStruct = malloc(sizeof(MyStruct)); 
    aStruct->test = 1; 
    return aStruct; 
} 
2

Другие ответы пока указывают на ошибку использования указателей и не выделяют память.

Однако вы действительно хотите использовать указатель на свою структуру вообще? Структура - это тип значения (POD в C-ese), вы можете просто передавать их примерно так же, как и целое число. Если ваша структура не является большой, или имеет значение (используя идентификатор означает, что два указателя относятся к одной и той же памяти), динамическое распределение структуры, вероятно, просто вам не нужно - особенно, поскольку вам нужно освободить ее позже ,

Для сравнения здесь ваш код без указателей:

typedef struct MyStruct 
{ 
    int test; 
} MyStruct; 

@interface StructTestingFile 
{ 
    MyStruct originalStruct; 
} 
@end 

И:

extern "C" MyStruct loadTestInt() 
{ 
    MyStruct aStruct; 

    aStruct.test = 1; 

    return aStruct; 
} 
Смежные вопросы