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.
* undefined behavior * - '* (pb + 1);' accède à "hors des limites" – UnholySheep
C'est un comportement indéfini, tout se passe. Et qu'est-ce que cela appelle la convention? –
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. –