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 :

sizeof(long) >= ? sizeof(long*)


Sujet :

C

  1. #1
    Membre actif

    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2011
    Messages : 95
    Points : 207
    Points
    207
    Par défaut sizeof(long) >= ? sizeof(long*)
    Bonjour,

    Que dit la norme sur l'inégalité entre sizeof(long) et sizeof(long*) (> ou >= ou dépendante du système) ?

    Dans un programme, j'ai fait un calloc (3000,sizeof(long)) au lieu d'un calloc (3000,sizeof(long*)), sur mon win xp, avec Turbo C.

    Ici, sizeof(long)=4 et sizeof(long *)=2. Existe-t-il des couples systèmes-compilateurs pour lesquel ces deux valeurs sont égales ?

    A bientôt.
    Toujours à adapter le problème à la structure de la machine, mais se soigne pour faire l'inverse.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lautrec1 Voir le message
    Bonjour,

    Que dit la norme sur l'inégalité entre sizeof(long) et sizeof(long*) (> ou >= ou dépendante du système) ?

    Dans un programme, j'ai fait un calloc (3000,sizeof(long)) au lieu d'un calloc (3000,sizeof(long*)), sur mon win xp, avec Turbo C.

    Ici, sizeof(long)=4 et sizeof(long *)=2. Existe-t-il des couples systèmes-compilateurs pour lesquel ces deux valeurs sont égales ?

    A bientôt.
    Je pense que sur un compilateur 32 bits ( pointeur sur 32 bits), tous les pointeurs ont une taille de 4 octets, donc : sizeof( long) = sizeof( long *).
    D'après mon expérience tous les pointeurs ont la même taille ( sur un même compilateur);
    2 octets sur du 16 bits (Turbo C, version MS-DOS(16 bits)), ...

    Concernant la norme je ne sais pas.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Je viens de regarder dans la norme et je n'ai pas trouvé comment est spécifié la taille d'un pointeur.

    A mon avis, il n'y aucune relation directe entre la taille d'un long et d'un long*. Tous les pointeurs ont la même tailles, puisque cela dépend de la taille de l'espace mémoire à adresser et non du type pointé. Les tailles des entiers sont définies avec des minimums donc cela est bien non corrélé. En pratique, on trouve beaucoup de systèmes où la taille d'un pointeur et celle d'un long sont les mêmes : énormément de PC en 32 ou 64 bits ont des long 32 ou 64 bits et des pointeurs 32 ou 64 bits. Prenons le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(void)
    {
        printf("%u %u\n", sizeof(long), sizeof(long*));
    }
    Sur mon PC Windows 7 64 bits avec MinGW, j'obtiens "4 4". Il existe donc des systèmes où les 2 sont égaux. Je pense par contre qu'il est peu probable d'avoir des pointeurs sur 64 bits et des long sur 32 bits, mais ce n'est pas interdit a priori (cas où on souhaite gérer une très grande mémoire avec un bus 32 bits) ?.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il n'y a pas de lien entre les deux.
    Note sur la taille des pointeurs: Je me suis laissé dire sur ce forum même que les pointeurs n'étaient pas garantis tous avoir la même taille, seulement que void* pouvait les accepter tous (et donc, que pour des pointeurs de taille différentes, void* devait avoir la plus grande).

    Bon, en pratique, sur PC, les tailles sont égales (ou du moins, si elles varient, ce n'est pas en dépendant du type).

    Pour ce qui est des tailles de pointeur par rapport à taille de long, on trouve de tout:
    Plate-forme long Pointeur
    DOS 16 bits 32 bits Near: 16 bits
    Far: 32 bits
    Windows 32 bits 32 bits 32 bits
    64 bits LLP64
    (Windows 64 bits)
    32 bits 64 bits
    64 bits LP64
    (Linux 64 bits)
    64 bits 64 bits
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre actif

    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2011
    Messages : 95
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour ce qui est des tailles de pointeur par rapport à taille de long, on trouve de tout:
    Plate-forme long Pointeur
    DOS 16 bits 32 bits Near: 16 bits
    Far: 32 bits
    Windows 32 bits 32 bits 32 bits
    64 bits LLP64
    (Windows 64 bits)
    32 bits 64 bits
    64 bits LP64
    (Linux 64 bits)
    64 bits 64 bits
    Merci Médinoc pour cette réponse précise et recherchée!
    Toujours à adapter le problème à la structure de la machine, mais se soigne pour faire l'inverse.

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il n'y a pas de lien entre les deux.
    Note sur la taille des pointeurs: Je me suis laissé dire sur ce forum même que les pointeurs n'étaient pas garantis tous avoir la même taille, seulement que void* pouvait les accepter tous (et donc, que pour des pointeurs de taille différentes, void* devait avoir la plus grande).
    Oui, c’est tout à fait vrai. Et c’est encore plus vrai entre pointeur et pointeur de fonction (exemple concret sur IA64).

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet, les pointeurs de fonctions sont une exception à la règle "doit être compatible avec void*" dans le standard C. Par contre, c'est exigé par POSIX, parce que dlsym() retourne un void*.

    Ça devient encore plus marrant en C++ avec les pointeurs de fonctions membres et l'héritage multiple.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. difference sizeof(int*) et sizeof(int)
    Par infoprogramation dans le forum Débuter
    Réponses: 2
    Dernier message: 27/08/2010, 10h21
  2. sizeof(variable) ou sizeof(type)
    Par soazig dans le forum C
    Réponses: 6
    Dernier message: 04/10/2006, 10h18
  3. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 14h34
  4. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 21h22
  5. Réponses: 2
    Dernier message: 05/06/2002, 13h29

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