web-dev-qa-db-fra.com

taille du pointeur vide

pourquoi sizeof pointeur vide 2?

22
alfesani

La taille d'un void* est une valeur dépendante de la plateforme. En règle générale, sa valeur est de 4 ou 8 octets pour les plates-formes 32 et 64 bits respectivement. Si vous obtenez 2 comme valeur, vous êtes probablement en cours d'exécution sur une plate-forme de codage 16 bits (ou vous avez potentiellement une erreur de codage).

Pourriez-vous publier le code que vous utilisez et quelques informations supplémentaires sur votre environnement/système d'exploitation?

42
JaredPar

Selon le norme C en ligne (projet n1256) :

6.2.5 Types
...
27 Un pointeur vers void doit avoir les mêmes exigences de représentation et d'alignement qu'un pointeur vers un type de caractère.39) De même, les pointeurs vers des versions qualifiées ou non qualifiées de types compatibles doivent avoir les mêmes exigences de représentation et d'alignement. Tous les pointeurs vers les types de structure doivent avoir les mêmes exigences de représentation et d'alignement les uns que les autres. Tous les pointeurs vers les types d'union doivent avoir les mêmes exigences de représentation et d'alignement les uns que les autres. Les pointeurs vers d'autres types n'ont pas besoin d'avoir les mêmes exigences de représentation ou d'alignement.

Quant à savoir pourquoi les pointeurs void et char ont une taille de 2 sur votre système, je suppose que c'est parce que vous êtes sur une plate-forme 16 bits.

6
John Bode

Un pointeur stocke une adresse mémoire qui pointe vers autre chose. La taille d'un pointeur dépend de votre plateforme. Sur une plate-forme 32 bits, vous avez besoin de 32 bits ou de quatre octets pour stocker une adresse mémoire, donc sizeof tout pointeur renverra 4.

Si sizeof (void *) est 2, vous utilisez probablement une plate-forme 16 bits.

1
Mendelt

Comme JaredPar l'a déjà souligné, cela dépend de la plate-forme. Autrement dit: combien de bits le processeur utilisé utilise-t-il pour l'adressage en mémoire? Pour les adresses 16 bits, vous obtiendrez une taille de 2 octets. Compilez-vous du code pour un microcontrôleur 16 bits?

0
S.C. Madsen

La taille d'un pointeur est égale à la taille d'un entier. Il peut être de 2 octets dans un compilateur 16 bits et de 4 octets dans un compilateur 32 bits et de 8 dans un compilateur 64 bits.

void *ptr, int *ptr et char *ptr vous donnera la même taille mais si vous le faites ptr++, le pointeur correspondant sautera en fonction des types de données. soit 1 position dans le cas void et char. De même 4 positions dans le cas int.

0
Greety_Tobin