Voici le code :
int main()
{
using namespace std;
int nights = 1001;
int * pt = new int; // allouer de l'espace pour un int
*pt = 1001; // y stocker une valeur
cout << "valeur de nights = ";
cout << nights << ": emplacement " << &nights << endl;
cout << "int ";
cout << "valeur = " << *pt << ": emplacement = " << pt << endl;
double * pd = new double; // allouer de l'espace pour un double
*pd = 10000001.0; // y stocker un double
cout << "double ";
cout << "valeur = " << *pd << ": emplacement = " << pd << endl;
cout << "emplacement du pointeur pd : " << &pd << endl;
cout << "taille de pt = " << sizeof(pt);
cout << ": taille de *pt = " << sizeof(*pt) << endl;
cout << "taille de pd = " << sizeof pd;
cout << ": taille de *pd = " << sizeof(*pd) << endl;
return 0;
}
Et maintenant l'auteur a fait une note sur le code :
Un autre point à noter est que généralement new utilise un bloc de mémoire différent des définitions de variables ordinaires que nous avons utilisées. La variable nights et pd ont toutes deux leurs valeurs stockées dans une région de mémoire appelée la pile, tandis que la mémoire allouée par le mot-clé new se trouve dans une région appelée le tas ou la mémoire libre.
Question Initiale:
Maintenant, ma préoccupation est la suivante : la variable pd a été créée avec le mot-clé new, elle devrait donc être stockée dans la région appelée tas comme la variable pt, car elles ont toutes deux été créées avec le mot-clé new.
Est-ce que j'ai manqué quelque chose ici ? Merci beaucoup d'avance pour vos réponses.
Question Révisée/Suite en réponse à la mise en attente:
Cette question a été mise en attente par 5 personnes parce qu'elles ne comprenaient pas ce que je demandais. Je crois que ma question a déjà été répondue, mais pour ceux qui ne sont toujours pas sûrs de ce que je demandais initialement, veuillez lire attentivement :
J'étais confus quant à l'explication de l'auteur sur l'endroit où les variables et leurs valeurs étaient stockées en mémoire. Jusqu'à l'explication de l'auteur, j'avais la conviction que toute mémoire créée dynamiquement (ou devrais-je dire pendant l'exécution après la compilation) en utilisant le mot-clé new était stockée dans le tas et non dans la pile.
Donc, j'étais perplexe lorsqu'il a écrit que la variable pd avait sa valeur stockée dans la pile, mais encore une fois comment est-ce possible si la variable a été créée pendant l'exécution avec le mot-clé new, elle devrait donc être dans le tas et non la pile.
Veuillez essayer d'utiliser le code ci-dessus comme référence et en particulier les **variables (nights, pd et pt)) dans votre réponse pour que je puisse le comprendre du point de vue de ce code.
0 votes
int * pt = nouveau int;
pourquoi ne pas simplementint t = 1001;
?26 votes
Vous ne manquez pas grand-chose. Et l'auteur du livre mélange les détails d'implémentation avec la sémantique du C++ lui-même. Je suggère de trouver un meilleur livre.
33 votes
pd
est sur la pile (tenant un pointeur), ce à quoipd
pointe est sur le tas.44 votes
-6 est particulièrement sévère pour une question bien rédigée avec un code compilable. En quoi cette question pourrait-elle être améliorée ? Le fait que le livre ait été écrit par une marionnette n'a aucun impact sur l'OP, en dehors de leurs compétences en matière de sélection de livres.
3 votes
@Bathsheba Je suppose que cela s'est produit lorsque le titre de la question a été écrit tout en majuscules :) mais à part ça, c'était en effet bien formulé
8 votes
J'ai recherché sur Google "un pointeur est-il sur la pile ou le tas" et le premier résultat était cette question qui répond à la question immédiate des OP sur les pointeurs sur la pile/le tas. Donc, le manque de recherche peut être une revendication valide.
0 votes
@ Je ne crie pas! lol Désolé pour ça. De plus, je ne peux pas utiliser int t = 1001; parce que j'apprends le concept de pointeurs et l'allocation de mémoire au moment de l'exécution.
2 votes
@Bathsheba Merci pour le soutien et l'empathie lol! Il semble que ce soit un public difficile à satisfaire. De plus, il semble que vous n'aimiez pas ma sélection de livres. Pouvez-vous me recommander un bon livre C++ pour un débutant? Merci d'avance!
2 votes
@ConteurQu'est ce que tu recommandes ?
7 votes
Jetez un coup d'œil ici
1 votes
@RichardCritten Je pense que tu as mis le doigt dessus. Merci. Juste pour être clair: variable pd ----> Pile | valeur pd -----> Tas ?
0 votes
Quel livre/site web est-ce que cela provient?
1 votes
@FabioTurati Est-ce que C++ Primer Plus.... est vraiment un excellent livre. Quand je continue de lire, il continue d'expliquer l'autre côté de l'histoire, "delete". J'avais simplement besoin de ces précieuses ressources du forum pour clarifier certaines questions que j'avais et dont je n'étais pas sûr. Merci!
1 votes
@Bathsheba Je pense que c'est le célèbre livre C++ Primer de Stephen Prata.
1 votes
@rnd809: les pointeurs peuvent pointer vers des valeurs n'importe où dans la mémoire. Généralement mais pas toujours sur le tas.
0 votes
@RichardCritten : En réalité, nous ne pouvons pas savoir. Ce n'est pas défini par la norme quand la pile/le tas doit être utilisé et comment. C'est juste un concept utilisé par le système sous-jacent et ne devrait pas être lié au langage. Ce serait même conforme à la norme si
pd
était sur le tas et que son déréférencement local était placé sur le tas. Bien entendu, cela n'aurait pas beaucoup de sens, mais ce serait conforme à la spécification du langage. C'est pourquoi je pense qu'il est incorrect de dire "En C++, X est sur le tas tandis que y sera sur la pile"...0 votes
@Zaibis Je sais que la norme ne nécessite pas de pile / tas et n'est qu'un détail de concept / d'implémentation. Cependant, je crois qu'il est important d'essayer de répondre aux questions au niveau de compréhension de la personne qui pose la question, trop d'informations d'un coup peuvent aussi bien perturber que aider. D'autres pourront compléter la réponse une fois que la question posée aura été répondue.