Les pointeurs

[Résolu]
Signaler
Messages postés
2
Date d'inscription
vendredi 5 septembre 2003
Statut
Membre
Dernière intervention
26 janvier 2009
-
Messages postés
2
Date d'inscription
vendredi 5 septembre 2003
Statut
Membre
Dernière intervention
26 janvier 2009
-
J'ai se programme

#include
#include
int main()
{

int * p1 = (int*)malloc(50*sizeof(int));
int *p2 = p1;
int i;
for(i=1;i<=50;i++) *p2++ = i;
*(int*)(&p1-2)= 18;
p2= p2 - 1;
*p2 = 999;
p2= p2 - 1;
*p2 = 777;
p2= p2 - 1;
*p2 = 888;
printf("%d\n", (p1-100)[147]);
printf("%d\n", p2-p1);
printf("%d\n",i);
p2=(int*)(&p2+1);
printf("%d\n", **(int**)p2);
free(p1);
return 0;
} Le problème est dans l'instruction *(int*)(&p1-2)18; n'est pas claire pour moi, de plus quand j'utilise le debugger, à l'instruction  p2(int*)(&p2+1); je constate que *p2 = 18. c'est quoi la realation entre les deux instruction ?
et enfin la derniere instruction provoque une erreur
 

Merci de me répondre

5 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Si on récapitule les adresses données par le débugger :

&p1    0x0012ff54    int **
&p2    0x0012ff48    int **

&p1-2    0x0012ff4c    int **
&p2+1    0x0012ff4c    int **

On voit que &p1-2 et &p2+1 on la même valeur, c'est pour ca que tu trouve 18 à chaque fois.
*(int*)(&p1-2)= 18; écrit 18 quelque part dans la pile d'exécution, mais on ne sait pas vraiment ou, c'est plutot dangereux de faire ca... C'est le genre de programme avec lequel on aura des comportements différents selon le compilateur, car les variables ne seront pas placées forcément dans le même endroit de la pile.

Enfin, c'est l'évaluation de l'expression **(int**)p2 qui plante. C'est normal car *p2 vaut 18, et 18 n'est pas une adresse valide.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

Salut,

Le but de ce programme est, ÀMHA, d'être obscur...
Alors je ne me permet pas de t'expliquer le tout.

D'abord, je ne comprends pas que tu obtiennes *p2 == 18 où tu le dis.
Avant l'instruction p2 (int*)(&p2+1); tu dois avoir *p2 888 alors qu'après, tu dois avoir l'adresse de p1 (qui a fort peu de chances d'être dix-huit qui n'est pas un multiple de quatre).

Pour t'aider, je te suggère de t'intéresser aux adresses des objets présents : p1, p2 et i.
Ce programme utilise le fait que ces adresses sont consécutives.

Quelle est l'erreur provoquée par la dernière instruction ? il ne devrait pas y en avoir.

Je te souhaite bon courage,
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
*(int*)(&p1-2)
Ce qu'il y a à l'adresse est imprédictible.
Son affectation sans erreur l'est encore plus.


C'eût été:
*(int*)(p1-2)
alors OK aurait pu être possible (pas ici, p1 est resté à l'adresse base de l'alloc).
mais prendre l'offset de p1 sur ESP et lui retirer 2 pour ensuite se servir du result comme adresse mémoire, c'est de la haute voltige sans filets.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
vecchio est passé devant et a tout dit (sous une autre forme).

ciao...
BruNews, MVP VC++
Messages postés
2
Date d'inscription
vendredi 5 septembre 2003
Statut
Membre
Dernière intervention
26 janvier 2009

Merci à vous tous et specialement à   vecchio, j'ai bien compris le truc