IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Taille des pointeurs


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut Taille des pointeurs
    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 *) == ... ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    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.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    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 *) == ... ?
    Non. Ce qui est assure c'est que caster n'importe que pointeur vers un void* (ou un char*, mais il vaut mieux utiliser un void* pour ca) puis revenir au pointeur initial est valide.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Ok merci beaucoup !

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    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 ?

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    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 ?
    Bin non tu te trompes pas, chez moi ca fait bien 4 octets partout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Bin non tu te trompes pas, chez moi ca fait bien 4 octets partout
    Oui mais peut-on pas l'assurer ?

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    Oui mais peut-on pas l'assurer ?
    Ca je ne jure de rien, ca peut changer suivant l'architecture matérielle voir même système je pense.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Ca je ne jure de rien, ca peut changer suivant l'architecture matérielle voir même système je pense.
    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

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    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.

  11. #11
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Hum, merci pour l'explication assez approfondie.

  12. #12
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    L'autre jour j'ai commencé à lire le (dernier) "standard internationnal" sur le C (C99)
    Jcopie colle les passages concernés
    Citation Envoyé par ISO/IEC 9899:TC2, chapitre 6.5.2, para 26
    A pointer to void shall have the same representation and alignment requirements as a
    pointer to a character type. Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.
    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.


    Et pour cet aspect
    Citation Envoyé par JMB
    Non. Ce qui est assure c'est que caster n'importe que pointeur vers un void* (ou un char*, mais il vaut mieux utiliser un void* pour ca) puis revenir au pointeur initial est valide.
    Citation Envoyé par ISO/IEC 9899:TC2, chapitre 6.3.2.3, para 7,8
    A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the
    pointed-to type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer. When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.

    A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer. If a converted pointer is used to call a function whose type is not compatible with the pointed-to type, the behavior is undefined.
    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).

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Gruik Voir le message
    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).
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille des pointeurs
    Par Bktero dans le forum Débuter
    Réponses: 12
    Dernier message: 23/04/2010, 17h31
  2. taille des pointeurs et des entiers
    Par luckyvae dans le forum C++
    Réponses: 15
    Dernier message: 09/03/2010, 11h18
  3. [Langage] Taille des pointeurs
    Par méphistopheles dans le forum Langage
    Réponses: 7
    Dernier message: 27/11/2008, 11h14
  4. [info] taille des adresses des pointeurs Java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 14h24
  5. Taille des champs proportionnelle...
    Par Depteam1 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/08/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo