Lors de l'exécution de certains programmes, j'ai réalisé que les adresses virtuelles sont toujours des multiples de quatre (en supposant des adresses virtuelles 32 bits). Exemple:Adresses virtuelles: multiples de quatre alignés - écriture à adresser "entre"
int main()
{
int a = 7;
int b = 10;
printf("%p %p", &a, &b);
}
donnera quelque chose comme:
- xff86c930 0xff86c934
- xfff58f80 0xfff58f84
- ...
La différence entre eux est toujours quatre. Maintenant, je essayé ceci:
sortieint main()
{
int a = 7;
int b = 10;
int *y = &b;
int yi = (int)y;
yi--;
y = (int*)yi;
printf("%p %p: %d\n", &b, y, *y);
*y = 7;
printf("%p: %d\n", y, *y);
}
Un exemple est:
0xffe460a0 0xffe4609f: 2807
0xffe4609f: 7
Qu'est-ce qui se passe ici? Qu'est-ce qui est référencé lorsque j'essaie d'écrire quelque chose à une adresse qui n'est pas un multiple de quatre? D'où vient ce 2807? Y aura-t-il une faute de page?
'les adresses virtuelles sont toujours des multiples de quatre' ce n'est pas vrai –
Ceci est appelé Comportement non défini. Vous avez manipulé 'y' pour devenir un pointeur invalide. – kaylum
@Lashane assumant cette architecture, c'est ... Je vais ajouter ceci à ma question. –