Как указатель void разыменовывается обратно в исходную структуру в C? - PullRequest
1 голос
/ 02 августа 2011

У меня проблемы с передачей значения структуры для интерфейса C для очереди, которая управляет очередью как связанным списком. Он сохраняет данные как пустые указатели, чтобы интерфейс мог управлять любыми данными в целом. Я передаю значение в качестве ссылки на указатель, которая затем сохраняется в качестве пустого указателя. Позже, когда он возвращается, я не знаю, как вернуть указатель void к исходному значению.

Что мне нужно сделать? Вот пример структуры.

typedef struct MyData {
    int mNumber;
} MyData;

Чтобы упростить все, я создал фиктивную функцию, которая имитирует все в нескольких строках кода.

void * give_and_go(void *data) {
    void *tmp = data;
    return tmp;
}

Вы можете видеть, что он принимает пустой указатель, устанавливает его как локальную переменную и затем возвращает его. Теперь мне нужно вернуть исходное значение.

MyData inVal;
inVal.mNumber = 100;
void * ptr = give_and_go(&inVal);
MyData outVal; // What converts ptr to the out value?

Вот где я застрял. Я использую Xcode, и он не позволит мне просто приводить ptr к MyData или различным альтернативам, которые я пробовал.

Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 02 августа 2011

Вы должны назначить void-указатель на MyData-указатель:

MyData *outVal = ptr;

Если вы используете C ++, вам придется явно привести его, что я рекомендую, так как он работает на обоих языках:

MyData *outVal = (MyData *)ptr;

В любом случае вы можете затем использовать оператор ->:

outVal->mNumber

Вы также можете назначить саму структуру таким образом:

MyData outVal = *(MyData *)ptr;

Но это копирует структуру, тогда как другие формы оставляют вас, указывая на исходную структуру (т. Е. Назначение outVal->mNumber изменит inVal.mNumber и наоборот). Нет никаких предпочтений a priori . Это зависит только от того, что вы намерены.

1 голос
/ 02 августа 2011

Бросьте свою пустоту * обратно в MyData *, затем разыменуйте ее.

MyData *outVal = (MyData*)(ptr);

0 голосов
/ 02 августа 2011

Из того, что я могу рассказать о коде, который вы предоставили, вы пытаетесь привести пустой указатель к типу без указателя. Это не сработает.

Вместо этого приведите свой пустой указатель обратно к указателю правильного типа:

MyData inVal;
inVal.mNumber = 100;
void* ptr = give_and_go(& inVal);
MyData* outVal = (MyData*)ptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...