2 votes

Comment un pointeur vide est-il déréférencé vers la structure d'origine en C ?

J'ai du mal à donner une valeur de structure à une interface C pour une file d'attente qui gère la file d'attente comme une liste liée. Elle conserve les données sous forme de pointeurs void pour permettre à l'interface de gérer n'importe quelle donnée de manière générique. Je passe la valeur comme une référence de pointeur qui est ensuite sauvegardée comme un pointeur vide. Plus tard, lorsqu'elle est renvoyée, je ne sais pas comment remettre le pointeur vide dans la valeur d'origine.

Que dois-je faire ? Voici l'exemple de structure.

typedef struct MyData {
    int mNumber;
} MyData;

Pour simplifier le tout, j'ai créé une fonction factice qui simule tout en quelques lignes de code.

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

Vous pouvez voir qu'elle prend un pointeur void, le définit comme une variable locale et le renvoie. Maintenant, je dois récupérer la valeur originale.

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

C'est là que je suis coincé. J'utilise Xcode et il ne me permet pas d'effectuer un simple cast ptr vers MyData ou d'autres alternatives que j'ai essayées.

Toute aide est appréciée.

4voto

Marcelo Cantos Points 91211

Vous devez affecter le pointeur void à un pointeur MyData :

MyData *outVal = ptr;

Si vous utilisez C++, vous devrez explicitement le caster, ce que je recommande de toute façon, puisque cela fonctionne dans les deux langages :

MyData *outVal = (MyData *)ptr;

Dans l'un ou l'autre cas, vous pouvez ensuite utiliser la déférence en utilisant l'option -> opérateur :

outVal->mNumber

Vous pouvez également affecter la structure elle-même ainsi :

MyData outVal = *(MyData *)ptr;

Mais ceci copie la structure, alors que les autres formes vous laissent pointer vers la structure d'origine (c'est-à-dire assigner à outVal->mNumber changera inVal.mNumber et vice-versa). Il n'y a pas de a priori préférence dans un sens ou dans l'autre. Cela dépend simplement de vos intentions.

1voto

Terry Mahaffey Points 7368

Transformez votre void* en MyData*, puis déréférencez-le.

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

0voto

Merlyn Morgan-Graham Points 31815

D'après ce que je peux dire du code que vous avez fourni, vous essayez de retransférer un pointeur void vers un type non pointeur. Cela ne fonctionnera pas.

Au lieu de cela, remplacez votre pointeur void par un pointeur pointeur du type correct :

MyData inVal;
inVal.mNumber = 100;
void* ptr = give_and_go(& inVal);
MyData* outVal = (MyData*)ptr;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X