Je mets le code directement.Le double pointeur pointe vers la variable int pour écraser la mémoire
#include <stdio.h>
struct A
{
int a;
int b;
};
int main()
{
struct A test;
double *p = (double *)&(test.a);
*p = 5;
printf("variable a: %d\n", &test.a);
printf("variable b: %d\n", &test.b);
return 0;
}
Je lance ce code dans centos7, le compilateur est gcc4.8.5
.And mon ordinateur utilise peu fin pour stocker.
Comme vous le voyez, la mémoire de la variable b
sera écrasé, je me attendais a
est 0x0000 0005
et b
est 0x0000 0000
.
Mais la réponse est:
variable a: 0
variable b: 1075052544
Pourquoi variables a
est 0x 0000 0000
et b
est 0x4014 0000
?
Ce comportement est indéfini. En outre, le 'double' 5 correspond à l'entier' 0x4014000000000000' de 64 bits, donc vous pouvez probablement comprendre ce qui se passe. Astuce: 'double' peut être plus grand que' int'. – unwind
Vous obtenez un résultat inattendu parce que vous avez menti à votre compilateur, et il a trouvé un moyen de revenir à vous. Vous avez dit au compilateur que '& (test.a)' est une adresse d'un 'double', mais c'est une adresse d'un nombre entier. – dasblinkenlight
Vous pouvez manipuler les paramètres d'optimisation et demander à votre compilateur de compiler du code où le résultat est quelque chose d'autre *. –