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 :

Ordre des variables dans la pile


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Ordre des variables dans la pile
    Bonjour,

    Débutant activement dans la programmation en C, j'ai lu à plusieurs endroits que les variables locales étaient empilés dans la pile en fonction de leur ordre de déclaration.

    J'ai donc voulu mettre ça en action pour voir ce que cela donne.

    Avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    int main()
    {
         int var;
         char buffer[20];
         printf("var : %p\n", &var);
         printf("buffer : %p\n", buffer);
    }
    J'obtiens :
    var : 0x7fff9095f78c
    buffer : 0x7fff9095f790
    Puis dans un second temps, en remplaçant dans le code précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         int var;
         char buffer[20];
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         char buffer[20];
         int var;
    J'obtiens :
    var : 0x7fff720b834c
    buffer : 0x7fff720b8350

    Est-il donc normal que l'adresse de "var" soit dans les deux cas inférieure à l'adresse de "buffer" ?

    Merci

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    Apparemment tu exhibes un exemple qui prouve que ce n'est pas le cas
    Les différentes normes C89,C99,C11 ne spécifient pas (donc n'obligent en rien) un ordre précis des variables locales lorsqu'elles sont stockées dans la pile. Elles n'obligent pas d'ailleurs à ce qu'elles soient stockées dans la pile, par exemple suivant les options d'optimisation elles pourront carrément ne pas exister du tout, ou n'être stockées que dans un registre, etc ...
    Le compilateur peut aussi pour des raisons d'alignement de données réorganiser l'ordre.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Hum d'accord !

    Et avec gcc par exemple, est-il possible de forcer l'ordre des variables dans la pile ?

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    forcer ? pas à ma connaissance, du moins pas directement ...

    tu peux essayer avec une structure englobant toutes tes "variables" de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      char str[4];
      int entier;
      double reel;
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      struct {
        char str[4];
        int entier;
        double reel;
      } mes_var_locales;
    Mais je n'en vois pas l'intérêt ? Pourquoi voudrais-tu interférer avec les décisions du compilateur (qui a priori seront souvent meilleures que celles que nous pourrions prendre) ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    En effet ! ça marche chez moi

    C'est vrai que ça doit pas servir à grand chose, c'était par pure curiosité à vrai dire. Merci pour ces réponses

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 63
    Points
    63
    Par défaut
    Bonjour, comme l'a dit kwariz ça peut dépendre de beaucoup de choses.

    Toutefois voilà le concept de base (du moins sur une architecture x86)

    Il y a globalement 5 segments de mémoire (d'où les segmentation fault ^^).

    Les voici en partant des adresse basses (plus proche de 0) vers les adresse hautes :

    -Le segment de texte (ou "segment de code") dans lequel se trouve toutes les instructions du langage machine.

    -Le segment de données, qui contient les variables globales et statiques initialisées.

    -Le bss qui contient les variables globales et statiques non-initialisées

    -Le tas qui contient toutes les variables allouées (sur le tas, car on peut aussi allouer sur la pile)

    -Et la pile, qui contient les variables locales et les appels de fonctions.

    Si deux variables d'un même segment sont déclarées l'une après l'autre il peut être difficile de déterminer si la première a une adresse plus basse ou plus haute que l'autre; et ce parce que éffectivement même le compilateur peut décider lui-même.

    Par exemple sur mon PC, sous windows si je fait avec un compilateur
    int a;
    int b;

    alors &a > &b. Or ceci est l'inverse si je compile le même code sur linux avec un autre compilateur (g++).

    Après, sur une architecture x86, logiquement le tas et la pile grandissent (quand on ajoute des variables) dans deux directions opposées : le tas vers les adresses en mémoire hautes, et la pile vers les adresses basses (pour minimiser l'espace gaspillé). Mais en testant avec 2 variables il n'est pas dit que l'effet soit observé car trop peu de variables en jeu...

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

Discussions similaires

  1. Ordre des variables dans une table
    Par stefsas dans le forum SAS Base
    Réponses: 6
    Dernier message: 02/09/2014, 10h22
  2. Ordre en mémoire des variables dans une structure
    Par guillaume-13015 dans le forum C
    Réponses: 8
    Dernier message: 12/03/2013, 15h52
  3. Ordre des variables JMX dans la console
    Par arno15 dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 22/01/2013, 16h54
  4. Ordre des tests dans la clause WHERE
    Par Tans98 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/09/2004, 10h52
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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