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 :

Différence d'adresse mémoire stack et heap


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut Différence d'adresse mémoire stack et heap
    Bonjour,

    Je ne comprends pas pourquoi les adresses mémoires retournée pour une variable sur la pile et allouée dynamiquement dans un même processus ne sont pas semblables.

    Le programme en fin de message donne le résultat suivant:

    adresse stack : 0x7fff3a3c2274
    adresse heap : 0x602010


    Pourquoi l'adresse du heap n'est pas en 0x7fff3a3cXXXX
    Le 0x602010 s'agit-il d'une clé associée à une "vraie" adresse mémoire, au quel cas qu'on fait un memcpy() sur un bout de mémoire dynamique ai-je pour chaque octet ce mécanisme de traduction de la clé vers la "vraie" adresse (je serai surpris, d'où mon incompréhension) ?

    Merci à vous

    Voici le programme qui me génère le message en gras donné plus haut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <stdlib.h>
    #include <iostream>
     
    using namespace std;
     
    int main(void)
    {
        int valeur;
        int * pointeur = new int();
        cout << "adresse stack : " << &valeur  << endl;
        cout << "adresse heap : " << pointeur << endl;
     
        return 0;
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Par défaut
    Bonjour,
    Tes deux objets sont différents.
    int valeur; est construit avec le contructeur par default du int. Il est dans la pile.
    int * pointeur = new int(); ca c'est un pointeur qui référence un objet int dans le tas;
    Les deux objets n'ont rien à voir. C'est pour cela qu'ils n'ont pas la même adresse.
    J'espère que c'est assez clair et qe cela pourra t'aider.
    A bientôt

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut
    Citation Envoyé par wakan Voir le message
    Bonjour,
    Tes deux objets sont différents.
    int valeur; est construit avec le contructeur par default du int. Il est dans la pile.
    int * pointeur = new int(); ca c'est un pointeur qui référence un objet int dans le tas;
    Les deux objets n'ont rien à voir. C'est pour cela qu'ils n'ont pas la même adresse.
    J'espère que c'est assez clair et qe cela pourra t'aider.
    A bientôt
    C'est très clair mais ça ne m'avance pas (et accessoirement c'était dit dans mon post), car ma question est justement de comprendre la différence entre c'est deux adresses alors même que pour moi elle était dans l'espace mémoire du processus et donc avaient la même base.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    N'oublie pas que les adresses mémoires sont virtuelles, donc que tes pointeurs sont des adresses vues "du processus".

    Et apparemment, sur ton système, la pile commence tout en haut de la moitié "utilisateur" (inférieure à 0x8000000000000000) de la mémoire virtuelle du processus, tandis que le tas commence plus proche du bas...
    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
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    1/ ce ne sont pas des @ physiques à moins que tu sois sous Windows 3.0
    2/Il n'y a pas de raison que la pile et le tas soit à la même place. Tu peux voir dans ce tuto (qui porte sur les problèmes de dépassement de capacité de la pile), le premier chapitre (page 9) présente la mapping mémoire pour un processus sous linux.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Il me parait bizarre, ce diagramme: Notamment pour la position de argc et argv...
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    N'oublie pas que les adresses mémoires sont virtuelles, donc que tes pointeurs sont des adresses vues "du processus".

    Et apparemment, sur ton système, la pile commence tout en haut de la moitié "utilisateur" (inférieure à 0x8000000000000000) de la mémoire virtuelle du processus, tandis que le tas commence plus proche du bas...
    Merci pour cette réponse.
    Effectivement, ces adresses sont virtuelles, toutefois il y a deux points qui m'échappent:
    + Pourquoi laisser un espace de 127 Tera octets entre le bas de la stack et le haut du tas? Je veux bien qu'on est des systèmes avec potentiellement beaucoup de mémoire enfin il y a encore des limites
    + Enfin si je relance 100 fois ce programme, 100 fois j'aurai la même adresse pour le bout de mémoire allouée dynamiquement alors que l'adresse sur la pile sera 100 fois différente, une idée ?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Comme je dis: La pile commence tout en haut, c'est traditionnel.

    Par contre, je suis vraiment surpris que la pile change d'adresse virtuelle à chaque exécution...
    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. Réponses: 16
    Dernier message: 30/05/2006, 18h46
  2. lire la valeur d'une adresse mémoire
    Par ilimo dans le forum Windows
    Réponses: 17
    Dernier message: 11/04/2006, 15h21
  3. PRoblème d'adresse mémoire
    Par pmboutteau dans le forum Access
    Réponses: 11
    Dernier message: 07/04/2006, 11h00
  4. Réponses: 6
    Dernier message: 19/09/2005, 19h48
  5. Differences Stack et Heap
    Par elsargento dans le forum C++
    Réponses: 9
    Dernier message: 26/05/2004, 16h10

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