Bonjour,
J'ai une petite question simple : est-ce qu'il est assuré par la norme que les pointeurs ont toujours la même taille, quelque soient les types des objets pointés ?
sizeof(char *) == sizeof(int *) == sizeof(double *) == ... ?
Version imprimable
Bonjour,
J'ai une petite question simple : est-ce qu'il est assuré par la norme que les pointeurs ont toujours la même taille, quelque soient les types des objets pointés ?
sizeof(char *) == sizeof(int *) == sizeof(double *) == ... ?
Du point de vue de la norme il faudrait le vérifier mais en tous cas peu importe leur type, ils occupent tous la même taille... en tous cas chez moi.
Ok merci beaucoup !
Pourtant un pointeur c'est simplement une adresse. Peu importe le type pointé non ? Donc une adresse reste une adresse et sa taille ne change pas. Me trompe-je ?
Nan pas le fait qu'une adresse vaille 4 octets, ça oui ça peut changer mais le fait ben qu'un pointeur peu importe sur quoi il pointe soit egal à la taille d'un autre pointeur.
En gros j'en reviens à la question originale parce que la réponse de Jean-Marc ne m'a pas éclairé du tout.
Parce qu'un pointeur c'est une adresse on est d'accord. Donc peu importe si on a un pointeur sur int sur char ou sur double, un pointeur reste une adresse. Donc logiquement un pointeur sur un type x fait la même taille qu'un pointeur sur un type y non ? Et si oui peut-on l'assurer ?
J'enlève le tag Résolu :D
Il y a des architectures qui sont adressables par mot (c'est a dire qu'une adresse désigne une zone de 16, 18, 24, 32, 36 ou 48 bits pour celles que je suis capable de citer si on me le demande, il y en a peut-être d'autres). Dans ce genre d'architecture, une implémentation pour le C a le choix, soit elle prend pour taille de char un mot complet, ce qui est quand même un peu du gaspillage surtout que certaines sont limitées en mémoire (p.e. 18 bits d'adresse), soit on prend une partie d'un mot. Et alors un char* doit outre contenir l'adresse, mais aussi une désignation du char dans le mot. Donc il faut plus de place qu'une simple adresse pour un char*.
Les architectures a usage général adressable par mot sont anecdotiques de nos jours, mais ne l'étaient pas durant les années 80. A noter que la seule que je connais ayant un compilateur C avec un bon support de C90 utilise un mot par pointeur de toute manière, les pointeurs vers autre chose que des char ayant 18 bits d'inutilisés.
De nos jours, les seules architectures adressable par mot répandues sont celles de DSP et autres processeurs spécialises. Les implémentations de C font souvent (toujours?) le choix d'un char par mot parce que ça simplifie le travail d'écriture du compilateur et que la manipulation de chaines de caractères n'est pas ceux a quoi ils servent.
Hum, merci pour l'explication assez approfondie. :D
L'autre jour j'ai commencé à lire le (dernier) "standard internationnal" sur le C (C99)
Jcopie colle les passages concernés
Ca dit qu'un "void *" a la meme representation qu'un "char *", qu'un "T *" a la meme representation qu'un "const/volatile T *", que les pointeurs sur structures ont tous la meme representation, pareil pour les union. Le reste des pointeurs n'a pas forcement la meme representation.Citation:
Envoyé par ISO/IEC 9899:TC2, chapitre 6.5.2, para 26
Et pour cet aspect
Citation:
Envoyé par JMB
Donc c'est bien ce qu'avait dit JeanMarc, mais il faut que les pointeurs soient correctement "alignés" (j'avoue que c'est encore flou pour moi cette histoire d'alignement).Citation:
Envoyé par ISO/IEC 9899:TC2, chapitre 6.3.2.3, para 7,8
Il est courant qu'avoir des contraintes du genre "les entiers doivent avoir une adresse multiple de 4" qu'on appelle contrainte d'alignement.
Si tu forces un pointeur dans un autre qui a une contrainte d'alignement plus forte (par exemple un double* dans un float*), la norme permet que la copie inverse ne donne pas le pointeur initial.
Un exemple serait un char* dans un int* pour une architecture adressable par mot ayant fait le choix d'avoir sizeof(char) != sizeof(int); il est naturel de perdre l'indication "char dans le mot" en faisant cette assignation.