Les pointeurs

Résolu
hicam2 Messages postés 2 Date d'inscription vendredi 5 septembre 2003 Statut Membre Dernière intervention 26 janvier 2009 - 25 janv. 2009 à 00:03
hicam2 Messages postés 2 Date d'inscription vendredi 5 septembre 2003 Statut Membre Dernière intervention 26 janvier 2009 - 26 janv. 2009 à 10:03
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
25 janv. 2009 à 10:44
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
3
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
25 janv. 2009 à 10:14
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,
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 janv. 2009 à 10:46
*(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++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 janv. 2009 à 10:51
vecchio est passé devant et a tout dit (sous une autre forme).

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hicam2 Messages postés 2 Date d'inscription vendredi 5 septembre 2003 Statut Membre Dernière intervention 26 janvier 2009
26 janv. 2009 à 10:03
Merci à vous tous et specialement à   vecchio, j'ai bien compris le truc
0