hicam2
Messages postés2Date d'inscriptionvendredi 5 septembre 2003StatutMembreDernière intervention26 janvier 2009
-
25 janv. 2009 à 00:03
hicam2
Messages postés2Date d'inscriptionvendredi 5 septembre 2003StatutMembreDernière intervention26 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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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.
cs_Chouchou182
Messages postés252Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention25 avril 20111 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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.