1 votes

Problème d'utilisation d'un pointeur void comme argument de fonction

Je ne comprends pas ce résultat...

Le code :

void foo(void * key, size_t key_sz) {
    HashItem *item = malloc(sizeof(HashItem));

    printf("[%d]\n", (int)key);

    ...

    item->key = malloc(key_sz);
    memcpy(item->key, key, key_sz);
}

void bar(int num) {
    foo(&num, sizeof(int));
}

Et je fais cet appel : bar(900011009);

Mais le printf() La sortie est :

[-1074593956]

J'ai vraiment besoin key pour être un pointeur vide, comment puis-je corriger cela ?

3voto

Saxon Druce Points 9404

Je pense que tu as besoin de ça :

printf("[%d]\n", *(int*)key); 

La clé est un pointeur void vers l'int, donc vous devez d'abord faire un cast vers un pointeur int, puis déréférencer pour obtenir l'int original.

2voto

Arkku Points 15523

Si vous transformez le pointeur en int vous obtenez le adresse comme valeur. Vous devez déréférencer les pointeurs void comme n'importe quel autre pointeur. Seulement, vous ne pouvez pas déréférencer directement void * Vous devez donc d'abord le convertir en un pointeur de type correct, ici int * . Puis déréférencer ce pointeur, c'est-à-dire *((int *)key) (parenthèses supplémentaires pour clarifier la préséance).

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