2017-07-07 4 views
-5

Lorsque j'exécute le programme, il imprime la valeur de la variable a. Mais quand je commente la ligne 'cout<<&b<<endl<<&a<<endl;' il imprime une valeur de poubelle. Quelle peut être l'explication derrière tout cela?valeur personnalisée sans toucher à la variable C++

#include<iostream> 
using namespace std; 

int main() 
{ 
    int a = 9; 
    int b = 10; 
    int *pb = &b; 
    cout<<&b<<endl<<&a<<endl; 
    cout<<*(pb+1); 
} 
+3

* undefined behavior * - '* (pb + 1);' accède à "hors des limites" – UnholySheep

+0

C'est un comportement indéfini, tout se passe. Et qu'est-ce que cela appelle la convention? –

+3

Parce que 'pb' pointe vers une variable * single *' int'. Quand vous faites '* (pb + 1)' c'est égal à 'pb [1]' qui essaie d'utiliser 'pb' en tant que tableau et affiche la valeur * second * dans le tableau. C'est hors limites de ce que 'pb' pointe et conduit à un comportement non défini. Un comportement indéfini rend l'ensemble de votre programme * mal formé * et invalide. –

Répondre

0

Lorsque vous imprimez les adresses a et b, cela force les variables à avoir une adresse mémoire. Sinon, une valeur peut être stockée dans un registre, ou pas du tout si elle n'est jamais utilisée.

Il est une optimisation très commun pour les statisticiens de transformer

const int a = 9; 
cout << a; 

dans

cout << 9; 

et ne jamais stocker a partout.

Et de toute façon, il n'y a pas de règles indiquant où et dans quel ordre les variables doivent être stockées en mémoire. C'est totalement à la hauteur du compilateur. Donc, votre hypothèse que &a == &b + 1 (ou &b - 1) n'est pas valide.

-1

La valeur erronée sur votre écran est l'adresse de a et b. et vous devriez essayer ceci:

int *pb = &b; 
+0

Vous avez raison, ce 'cout << & b << endl << & un << endl;' affichera les adresses de 'a' et' b', mais tout ce que vous essayez d'obtenir avec cette "réponse" sera ne produisent que des erreurs de compilation. – muXXmit2X

+0

Acc. à la question que la personne demande juste que l'explication derrière elle, ne demandant aucune erreur! – Piyush

+0

_vous devriez essayer ceci: 'int * pb -> & b;' _ Ce que vous suggérez il y a une syntaxe invalide et produira des erreurs de compilateur! Btw. Je ne suis même pas sûr de ce que vous essayez de suggérer ici. – muXXmit2X

0

Il y a deux endroits où vous pourriez obtenir « charabia » valeurs mais seulement l'un d'eux est actuellement où les ordures est imprimé.

Cette cout << &b << endl << &a << endl; imprimera les adresses de a et b en utilisant l'adresse-de-l'opérateur. Ce que vous voyez là ne sont pas les valeurs de a et b plutôt là où ils sont stockés dans la mémoire. Ce sont des valeurs hexadécimales qui changeront probablement chaque fois que vous lancerez le programme. C'est le comportement attendu.

Ensuite, il y a cette construction: *(pb + 1) qui invoque réellement un comportement indéfini. Mais pourquoi est-ce? Tout d'abord pb est un pointeur de sorte qu'il stocke une adresse, plus précisément l'adresse mémoire où b est stocké. Vous pouvez soit imprimer pb directement ce qui entraînera la même chose que cout << &b ou le déréférencer en utilisant l'opérateur de déréférencement *. Donc, ce cout << *pb afficherait la valeur et non l'adresse pb pointant vers (10 btw). Maintenant à ce qui ne va pas avec votre déclaration - (pb + 1) n'augmente pas la valeur pb pointe mais l'adresse stockée dans pb. Donc, il ne pointe plus à la valeur de b mais à une autre valeur quelque part dans la mémoire. Ensuite, vous déréférencer cette adresse et lire une valeur aléatoire - c'est votre valeur "garbage". Ce que vous voulez probablement, c'est augmenter la valeur pb pointe vers. Donc, cout << (*pb + 1) va imprimer 11 (notez où les crochets sont placés). Mais cout << b entraînerait toujours 10. Si vous souhaitez modifier réellement la valeur de b, vous pouvez le faire:

int b = 10; 
int *pb = &b; 
*pb += 1; 
cout << b; 

maintenant b a été augmenté d'un sans toucher b lui-même.