Comment la mémoire est-elle allouée à des variables de types de données différents?

J’ai écrit le code suivant.

#include int main() { int x = 1 ; int *j = &x ; int y = 2 ; int *t = &y ; printf("%p\n" , (void *)j); printf("%p" , (void *)t); } 

La sortie est 0028FF14 0028FF10 .

Ce que je veux dire, c’est que la différence entre les adresses est «4».

Alors que dans ce cas

 #include int main() { char x = 't' ; char *j = &x ; char y = 'f' ; char *t = &y ; printf("%p\n" , (void *)j); printf("%p" , (void *)t); } 

La sortie est 0028FF17 0028FF16

La différence est 1 .

La différence dans le premier cas est 4 . Alors que dans le second cas c’est 1 . Pourquoi est-ce?

Et que vais-je obtenir si j’imprime les valeurs de toutes les adresses de mémoire individuellement?

Peut-être que c’est vraiment général et connu, mais je viens de commencer C, le résultat du programme me confond.

Mettre à jour
Maintenant, utilisez le format %p et convertissez la valeur du pointeur en void* pour imprimer la valeur du pointeur comme suggéré par Keith Thompson.

    Il n’y a pas d’exigences sur l’ordre dans lequel les objects déclarés sont disposés en mémoire. Apparemment, le compilateur que vous utilisez arrive à placer x et y l’un à côté de l’autre. Cela aurait pu placer j entre eux, mais pas.

    En outre, la méthode correcte pour imprimer une valeur de pointeur consiste à utiliser le format %p et à convertir la valeur du pointeur en void* :

     printf("%p\n", (void*)j); printf("%p\n", (void*)t); 

    Cela produit une représentation de la valeur du pointeur lisible par l’homme, définie par l’implémentation, généralement mais pas toujours en hexadécimal.

    Si vous vous souciez de l’ordre dans lequel les variables déclarées sont allouées en mémoire, vous faites probablement quelque chose de mal, ou du moins de inutile. Laissez le compilateur s’inquiéter de savoir où placer les choses. Il sait ce qu’il fait.

    Pour les débutants, la différence n’est pas toujours de quatre, c’est juste une heureuse coïncidence. Le compilateur est autorisé à coller des variables en mémoire où il le souhaite. Dans ce cas, il a mis vos deux variables côte à côte en mémoire et la différence peut s’expliquer par la taille d’un entier sur votre système (4 octets) et la taille d’un caractère sur votre système (1 octet). Sur d’autres systèmes, elles peuvent être de tailles différentes et placées à des emplacements différents.

    Chaque entier occupe quatre octets. Par conséquent, chaque adresse mémoire entière est décalée de 4. Un caractère n’occupe qu’un octet. Par conséquent, ses adresses mémoire sont décalées de un.