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 :

Occupation en mémoire suivant le type de la variable.


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 59
    Par défaut Occupation en mémoire suivant le type de la variable.
    Bonjour à tous.
    Vla je me remets dans le C en voulant bien comprendre ce qui se passe "a l'intérieur" de la machine.
    Ya un ptit truc qui m'échappe.
    Voici l'intérieur de ma fonction main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           printf("short       : %d\n", sizeof( short ));
           printf("int         : %d\n", sizeof( int ));
           printf("float       : %d\n", sizeof(float ) );
           printf("double      : %d\n\n", sizeof(double ) );
     
    	short var ;
    	int var2;
    	printf("%d\n%d",&var,&var2);
     
        return 0;
    et voici ce que cela m'affiche:
    short : 2
    int : 4
    float : 4
    double : 8

    -1077324366
    -1077324372
    Je veux donc afficher l'adresse en mémoire de ma première variable, ainsi que celle de la deuxième.
    Ma question est:
    Pourquoi ma première variable occupe t-elle 6 emplacements mémoires (soit 6 octets) alors qu'un type short en occupe normalement 2?
    J'ai le même soucis avec le double (qui prend 12 au lieu de 8).
    Seuls les int et les floats correspondent bien.
    Je vous remercie d'avance.
    Cordialement.

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("short       : %d\n", sizeof( short ));
    short : 2
    Citation Envoyé par nodogeid
    Pourquoi ma première variable occupe t-elle 6 emplacements mémoires (soit 6 octets) alors qu'un type short en occupe normalement 2?
    Le taille fait bien 2!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("double      : %d\n\n", sizeof(double ) );
    double : 8
    Citation Envoyé par nodogeid
    J'ai le même soucis avec le double (qui prend 12 au lieu de 8).
    Le taille fait bien 8!

    Qu'est ce qui ne va pas en fait?

    Citation Envoyé par nodogeid
    Seuls les int et les floats correspondent bien.
    Sachant que ca dépend de l'implémentation de ton processeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    short var ;
    int var2;
    printf("%d\n%d",&var,&var2);
    Faudrait initialiser les variables à une valeur par défaut.

    Citation Envoyé par nodogeid
    Je veux donc afficher l'adresse en mémoire de ma première variable, ainsi que celle de la deuxième.
    Pour cela, tu peux utiliser un pointeur sur ta variable. Par contre, la taille mémoire d'un pointeur est différent de la taille mémoire du type pointé.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    Je pense qu'il doit y avoir un rapport avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    short i;
    double j;
     
    printf("%ld %ld\n",sizeof(&i),sizeof(&j));

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'est le int qui est six octets avant le short, pas l'inverse (les valeurs sont négatives).

    Pour éviter ce genre de problèmes, affiche tes pointeurs avec %p...
    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.

Discussions similaires

  1. Occupation en mémoire d'un String
    Par ChPr dans le forum Langage
    Réponses: 6
    Dernier message: 20/12/2013, 15h32
  2. ItemsControl suivant le type de colonnes
    Par DiscoPlacid dans le forum Silverlight
    Réponses: 6
    Dernier message: 04/12/2010, 14h41
  3. Changer el type d'une variable sql sous postgre8/admin
    Par smag dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/08/2005, 12h31
  4. Réponses: 9
    Dernier message: 22/07/2005, 16h10
  5. pb avec ma requete suivant le type du chp
    Par boucher_emilie dans le forum ASP
    Réponses: 17
    Dernier message: 06/08/2004, 10h46

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