Lancer des pointeurs vides

J’ai vu beaucoup de ce qui suit dans l’ancien code C:

type_t *x = (type_t *) malloc(...); 

A quoi sert de faire en sorte que le pointeur renvoyé par malloc() soit void * ? Est-ce parce que les anciens compilateurs C ne supportaient pas les pointeurs vides et que malloc() utilisé pour retourner char * place?

Votre propre explication est la bonne. Pre-ANSI C (‘K & R’ C) n’avait pas de type void * avec conversion implicite. char * doublé en tant que type pseudo void * , mais vous aviez besoin de la conversion explicite d’une conversion de type.

En C moderne, le casting est mal vu car il peut supprimer les avertissements du compilateur pour un prototype manquant de malloc . En C ++, le casting est nécessaire (mais là, vous devriez utiliser new au lieu de malloc plupart du temps).

Mettre à jour

Mes commentaires ci-dessous qui essayaient d’expliquer pourquoi le casting était requirejs étaient un peu obscurs, je vais essayer de mieux l’expliquer ici. Vous pourriez penser que même lorsque malloc retourne char * , la dissortingbution n’est pas nécessaire car elle ressemble à:

 int *a; char *b = a; 

Mais dans cet exemple, un casting est également nécessaire. La deuxième ligne est une violation de contrainte pour l’opérateur d’affectation simple (C99 6.5.1.6.1). Les deux opérandes de pointeur doivent être de type compatible. Lorsque vous changez ceci en:

 int *a; char *b = (char *) a; 

la violation de contrainte disparaît (les deux opérandes ont maintenant le type char * ) et le résultat est bien défini (pour la conversion en pointeur de caractère). Dans la “situation inverse”:

 char *c; int *d = (int *) c; 

le même argument est valable pour la conversion, mais lorsque int * a des exigences d’alignement plus ssortingctes que char * , le résultat est défini par la mise en oeuvre .

Conclusion: Dans les jours pré-ANSI, la conversion de type était nécessaire, car malloc renvoyé char * et la non-définition des résultats est une violation de contrainte pour l’opérateur ‘=’.

Le problème ici n’est pas la compatibilité avec aucun dialecte de C. Le problème est C ++ . En C ++, un pointeur vide ne peut pas être automatiquement converti en un autre type de pointeur. Donc, sans conversion explicite, ce code ne serait pas compilé avec un compilateur C ++.

Je ne suis pas au courant que Malloc ait jamais retourné un omble *.

Mais la diffusion implicite de void * à type_t * (ou de tout autre type) n’a pas toujours été autorisée. D’où la nécessité de lancer explicitement le type approprié.

A quoi sert de faire en sorte que le pointeur renvoyé par malloc () soit vide *?

Bien au contraire. Vous devez convertir un pointeur void en un type réel avant de pouvoir l’utiliser, car un void * ne signifie rien sur les données stockées à cet emplacement.