Coulée des pointeurs vides
J'ai vu beaucoup de la suite dans les vieux code C:
type_t *x = (type_t *) malloc(...);
Quel est le point de coulée le pointeur retourné à partir de malloc()
puisque c'est void *
? Est-ce parce que les anciens compilateurs C ne prend pas en charge nulle pointeurs et malloc()
utilisés pour le retour char *
à la place?
source d'informationauteur Blagovest Buyukliev
Vous devez vous connecter pour publier un commentaire.
Votre propre explication est la bonne. Pré-ANSI C ('K&R' C) ne pas avoir de
void *
type de conversion implicite.char *
doublé comme un pseudovoid *
type, mais vous avez besoin d'une conversion explicite de type cast.Moderne C le casting est mal vu car il peut supprimer les avertissements du compilateur pour un manque prototype de
malloc
. En C++, le casting est nécessaire (mais là, vous devriez être en utilisantnew
au lieu demalloc
la plupart du temps).Mise à jour
Mes commentaires ci-dessous qui tentent d'expliquer pourquoi le casting est requis étaient un peu floues, je vais essayer d'expliquer mieux ici. Vous pourriez penser que, même lorsque
malloc
retournechar *
le casting n'est pas nécessaire parce qu'il est semblable:Mais dans cet exemple, un casting est également nécessaire. La deuxième ligne est un violation de la contrainte de pour la simple opérateur d'affectation (C99 6.5.1.6.1). Les deux pointeur opérandes doivent être de type compatible. Lorsque vous modifiez ce:
la violation de la contrainte disparaît (les deux opérandes ont maintenant le type de
char *
) et le résultat est bien défini (pour la conversion d'un pointeur de char). Dans la "situation inverse':le même argument tenir pour le casting, mais quand
int *
a plus strict alignement des exigences dechar *
le résultat est de mise en œuvre définies.Conclusion: Dans la pré-ANSI jours le type de fonte était nécessaire parce que
malloc
retournéchar *
et pas de casting résultats est une violation de contrainte pour l'opérateur'='.Le problème ici n'est pas de compatibilité avec n'importe quel dialecte de C. Le problème est C++. En C++, un vide pointeur ne peut pas être automatiquement convertis pour tout autre type de pointeur. Alors, sans un cast explicite, ce code n'est pas compilé avec un compilateur C++.
Je ne suis pas au courant que malloc jamais retourné un char*.
Mais implicite de la conversion de void* vers type_t* (ou de tout autre type) n'a pas toujours été admise.
Par conséquent, la nécessité de convertir explicitement le type approprié.
Bien au contraire. Vous besoin de jeter un vide pointeur vers un type réel avant de pouvoir l'utiliser, car un
void *
ne signifie rien sur les données stockées à cet endroit.