web-dev-qa-db-fra.com

c: taille du vide *

Je suis un peu confus avec un pointeur void * en C. Surtout après avoir lu cette question: La taille de (un pointeur) est-elle toujours égale à quatre? , où une personne dit qu'il n'y a aucune garantie que sizeof (int *) == sizeof (double *)

Ma question est: existe-t-il une garantie de sizeof (void *)> = sizeof (tout autre type de pointeur)? En d'autres termes, puis-je toujours attribuer un pointeur some_type * à un pointeur void *, puis le récupérer en tant que some_type *?

24
facha

Seuls les pointeurs de données. void * peut contenir n'importe quel pointeur de données, mais pas de pointeur de fonction.

Voici un FAQ C .

les void * ne sont garantis que pour contenir des pointeurs d'objet (c'est-à-dire de données); il n'est pas portable de convertir un pointeur de fonction en type void *. (Sur certaines machines, les adresses de fonction peuvent être très volumineuses, plus grandes que n'importe quel pointeur de données.)

Comme pour la première partie, oui, différents types peuvent avoir pointeurs de différentes tailles :

27
cnicutar

La valeur stockée dans le pointeur est une adresse en mémoire. Si vous utilisez un système 32 bits, ce pointeur dans la mémoire aura une longueur de 32 bits (ou quatre octets). Si vous utilisez un système 64 bits, ce pointeur en mémoire aura une longueur de 64 bits (ou huit octets).

La taille des données qui contiennent l'emplacement en mémoire n'a rien à voir avec la taille des données représentées à cet emplacement en mémoire.

Quant à savoir comment un char * diffère d'un double *, les char * peut pointer vers n'importe quel emplacement, mais le double * doit pointer vers quelque chose le long d'une limite de huit octets. Les données plus volumineuses doivent être alignées selon les règles du processeur sur lequel vous vous trouvez. Ainsi, les pointeurs vers de petites données ne sont généralement pas compatibles avec les pointeurs vers de grandes données (par exemple, vous ne devez pas pointer un double * pointeur vers un char * adresse); mais vous évitez d'aller dans l'autre direction (par exemple, vous pouvez pointer un char * pointeur vers un double * adresse).

10
unpythonic