¿Cómo se asigna la memoria a variables de diferentes tipos de datos?

Escribí el siguiente Código.

#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 salida es 0028FF14 0028FF10 .

El punto que quiero señalar es que la diferencia entre las direcciones es `4 ‘.

Considerando que en este caso

 #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 salida es 0028FF17 0028FF16

La diferencia es 1 .

La diferencia en el primer caso es 4 . Mientras que en el segundo caso es 1 . ¿Por que es esto entonces?

¿Y qué obtendré si imprimiera valor en todas las direcciones de memoria individualmente?

Tal vez sea realmente general y conocido, pero acabo de comenzar con C, por lo que la salida del progtwig me confunde.

Actualizar
Ahora utiliza el formato %p y convierte el valor del puntero a void* para imprimir el valor del puntero como sugiere Keith Thompson.

No hay requisitos sobre el orden en que los objetos declarados se presentan en la memoria. Aparentemente, el comstackdor que estás usando pasa a colocar x una al lado de la otra. Podría haber colocado j entre ellos, pero no lo hizo.

Además, la forma correcta de imprimir un valor de puntero es usar el formato %p y convertir el valor del puntero a void* :

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

Esto produce una representación legible por humanos, definida por la implementación, del valor del puntero, típicamente pero no siempre en hexadecimal.

Si le importa el orden en que se asignan las variables declaradas en la memoria, probablemente esté haciendo algo mal, o al menos no sea útil. Deja que el comstackdor se preocupe por dónde poner las cosas. Sabe lo que está haciendo.

Bueno, para empezar, la diferencia no es siempre cuatro, simplemente son cuatro por feliz coincidencia. El comstackdor tiene permitido pegar variables en la memoria donde quiera que quiera. En este caso, ha puesto sus dos variables una junto a la otra en la memoria y la diferencia se puede explicar ya que es el tamaño de un entero en su sistema (4 bytes) y el tamaño de un carácter en su sistema (1 byte). En otros sistemas pueden tener diferentes tamaños y colocarse en diferentes ubicaciones.

Cada entero ocupa cuatro bytes, por lo tanto, cada dirección de memoria entera está desplazada en 4. Un carácter solo toma un byte, por lo tanto, sus direcciones de memoria están desplazadas en uno.