web-dev-qa-db-fra.com

Pourquoi taper un pointeur vide?

Étant nouveau dans C, le seul usage pratique que j'ai obtenu des pointeurs vides est pour des fonctions polyvalentes qui peuvent stocker différents types de données dans un pointeur donné. Par conséquent, je n'ai pas transtypé mon pointeur lors de l'allocation de mémoire.

J'ai vu quelques exemples de code qui utilisent parfois des pointeurs void, mais ils sont transtypés. Pourquoi est-ce utile? Pourquoi ne pas créer directement le type de pointeur souhaité au lieu d'un vide?

19
Ann

Il existe deux raisons pour convertir un pointeur vide en un autre type en C.

  1. Si vous souhaitez accéder à quelque chose pointé par le pointeur (*(int*)p = 42)
  2. Si vous écrivez du code dans le sous-ensemble commun de C et C++, plutôt que de "vrai" C. Voir aussi Dois-je lancer le résultat de malloc?

La raison de 1 devrait être évidente. Le deuxième est que C++ interdit la conversion implicite de void* à d'autres types, tandis que C le permet.

17
wolfgang

Vous devez convertir des pointeurs void vers autre chose si vous voulez les déréférencer, par exemple vous obtenez un pointeur void comme paramètre de fonction et vous savez avec certitude qu'il s'agit d'un entier:

void some_function(void * some_param) {
    int some_value = *some_param; /* won't work, you can't dereference a void pointer */
}

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */
}
9
Guillaume