8
votes

Adresse de la pile et du tas en C ++

Correction:

J'ai gêné le concept d'adresse du pointeur et l'adresse indiquée par le pointeur, le code suivant a donc été modifié. Et maintenant, il imprime ce que je veux, la variable A, C, I, J, K, P est sur la pile et la variable B, D sont sur le tas. Les variables statiques et globales sont sur un autre segment. Merci beaucoup pour vous tous! P>


Eh bien, je sais que ces deux concepts sont profondément discutés ... mais j'ai toujours des questions pour le code suivant: P>

&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00


4 commentaires

Je ne comprends pas de votre question pourquoi vous pensez qu'une variable est sur la pile ou le tas en fonction des adresses que vous avez montrées.


Cela n'a vraiment pas de sens. Vous ne pouvez pas faire de toute sorte d'inférence sur l'endroit où votre mémoire est


Dupliqué possible de Utilisation appropriée de la pile et du tas en C ++?


Je n'aime pas le double duplicaté, mais je vote pour Narq, car le poste était basé sur un malentendu sur la partie de l'OP et que cela a été effacé, il n'y a plus de question. @Zhongxia: Si vous êtes toujours intéressé par ce qui se passe ici, vous voudrez peut-être lire sur le "segment de données".


8 Réponses :


15
votes

Votre compréhension est fausse. Par exemple, B est un pointeur - si vous souhaitez l'adresse de l'objet créé par Nouveau , vous devez imprimer B , pas < Code> & B . B est une variable locale, de sorte qu'elle elle-même (trouvée à & b ) est sur la pile.

Pour votre exemple, n , l et m sont probablement quelque part dans la section de données de votre exécutable. Comme vous pouvez le constater, ils ont des adresses similaires. Toutes les autres variables que vous impriment sont sur la pile - leurs adresses sont également similaires les unes des autres. Certains d'entre eux sont des pointeurs pointant vers des objets alloués à partir du tas, mais aucune de vos impressions ne le montrerait.


0 commentaires

2
votes

Si vous souhaitez imprimer l'adresse de tout d code> pointe vers (dans ce cas, il pointe vers un objet sur le tas), faites

   cout << "&d: " << &d << endl;


0 commentaires

3
votes

Votre compréhension est correcte.

  • Les variables locales sont allouées sur la pile.
  • Les objets alloués dynamiquement sont alloués sur le tas.

    Bien que vous preniez l'adresse de la variable locale systématiquement dans votre exemple.
    Exemple: imprimer d pas l'adresse de d . Comme d est une variable locale (l'adresse est donc similaire à celle c ) mais c'est une variable de pointeur qui pointe sur un objet alloué de manière dynamique (qui est sur le tas) .

    Comment le compilateur implémente la pile et le tas va varier.

    dans le système d'exploitation moderne La pile et le tas peuvent même partager la même zone (c'est-à-dire que vous pouvez implémenter la pile en allouant des morceaux dans le tas).


1 commentaires

C'est vrai, mais pas pourquoi l'OP obtient les valeurs qu'il est. :-)



0
votes

La distinction entre les deux formes, d'une perspective pure C ++, est uniquement liée à la manière dont la durée de vie des objets est gérée.

d'ici, bonne lecture


0 commentaires

0
votes

Les variables statiques sont dans le segment de données. Vous mélangez également l'adresse d'un pointeur et d'une valeur informatique. Par exemple A:

A est une variable locale de type A * sur la pile. & A donne également à l'adresse où un actalité a séduit (sur la pile). La valeur d'A est une adresse d'un objet de tas de type A;


0 commentaires

0
votes

Vous ne pouvez pas dépendre de divers compilateurs de la même manière. Pour presque chaque morde, vous écrirez la distinction entre la pile et le tas ne signalent pas de sens. Ne vous inquiétez pas pour ça.


0 commentaires

2
votes

Les seuls qui ne sont pas «ensemble» dans votre exemple sont l , m et n . Ils sont deux statiques et un global, ils ne sont donc pas alloués sur la pile à coup sûr. Ils ne sont pas issus d'un tas ni, probablement, ils proviennent d'un segment de .data de votre module. Le seul à partir d'un tas devrait être l'adresse B sur, mais vous imprimez l'adresse de B lui-même, pas ce qu'il pointe de.


1 commentaires

Sachez également que votre «neiness» est plutôt spécifique à la plate-forme. Les adresses peuvent sembler complètement différentes (c.-à-d. & p pour être "loin" à partir de & j ) sur une plate-forme comme IA64 avec sa pile "Backing Store '", voir blogs.msdn.com/b/slavao/archive/2005/03/ 19 / 399117.aspx



0
votes

On peut ne rien assumer sans quoi que ce soit sur les adresses relatifs des choses de la pile par rapport à ceux du tas ni, à ce sujet, les adresses relatives de tous les pointeurs qui ne sont pas tous dérivés du même tableau ou alloués (via MALLOC , blocococ, etc.) bloc. Je ne suis même pas sûr que des pointeurs sont tenus d'être classables.


0 commentaires