c: la taille de void*
Je suis un peu confus avec un pointeur void* en C. Surtout après la lecture de cette question: Est la sizeof(certains pointeur) toujours égal à quatre?, lorsqu'une personne affirme qu'il n'existe aucune garantie que sizeof(int *) == sizeof(double *)
Ma question est: est-il une garantie de sizeof(void*) >= sizeof(tout autre type de pointeur)?
En d'autres termes, puis-je toujours attribuer une some_type* pointeur vers un pointeur void* et le récupérer comme some_type*?
Vous devez vous connecter pour publier un commentaire.
Seulement les pointeurs de données.
void *
peut contenir des données de pointeur, mais pas des pointeurs de fonction.Ici est un C FAQ.
Comme pour la première partie, oui, de différents types peuvent avoir les pointeurs de tailles différentes:
double*
pointeurs peuvent pas être inutilement grand et juste de ne pas utiliser certains de leurs morceaux. Vous pourriez avoirsizeof(double*) > sizeof(void*)
même si unvoid*
peut contenir toutes les valeurs dedouble*
.void*
, qui n'a pas besoin d'être en 32 bits, mais pourrait être de 24 bits.void*
peut en fait détenir une méthode de pointeur.dlsym
) où elles auraient pu s'en sortent bien défini C code. Et en fait, cette décision peut être réexaminée à l'avenir, selon la page de man.La valeur stockée dans le pointeur est une adresse de mémoire. Si vous êtes sur un système 32 bits, ce pointeur dans la mémoire va être 32 bits (ou quatre octets) de long. Si vous êtes sur un système 64 bits, le pointeur dans la mémoire va être 64 bits (huit octets) de long.
La taille des données que détient l'emplacement de la mémoire n'a rien à voir avec la taille des données représentées à l'emplacement de la mémoire.
Quant à la façon d'un
char *
diffère d'undouble *
, lechar *
peut pointer vers n'importe quel endroit, mais ledouble *
a à un point à quelque chose le long d'un huit-frontière d'octet. Plus de données doit être alignée selon les règles du processeur que vous êtes sur. Ainsi, les pointeurs de données de petite taille ne sont pas, en général, compatible avec les pointeurs de données de grande taille (par exemple, vous ne devriez pas point unedouble *
pointeur vers unchar *
adresse); mais vous êtes enregistrer dans l'autre sens (par exemple, vous pouvez pointer unechar *
pointeur vers undouble *
adresse).