Aquí está el código -

#include <stdio.h>
int main()
{
    char character_1 = '0';
    int integer_1 = 12321;
    char character_2 = '1';
    char character_3 = '2';

    printf("Integer occupies %zu byte(s) of space.\n",sizeof(int));
    printf("Address of Integer 1: %p\n",(void*)&integer_1);
    printf("\n");

    printf("Character occupies %zu byte(s) of space.\n",sizeof(char));
    printf("Address of Character 1: %p\n",(void*)&character_1);
    printf("Address of Character 2: %p\n",(void*)&character_2);
    printf("Address of Character 3: %p\n",(void*)&character_3);
    printf("\n");
    return 0;
}

Y, la salida generada -

Integer occupies 4 byte(s) of space.
Address of Integer 1: 000000000061FE18

Character occupies 1 byte(s) of space.
Address of Character 1: 000000000061FE1F
Address of Character 2: 000000000061FE17
Address of Character 3: 000000000061FE16

Quiero imprimir las direcciones de todos los cuatro bytes de espacio ocupados por la variable entera integer_1 , lo que significa imprimir los cuatro de estos - {{x1} }, 000000000061FE19, 000000000061FE1A y 000000000061FE1B. ¿Cómo lo hago?

1
Imtiaz 29 may. 2021 a las 17:03

2 respuestas

La mejor respuesta

¿Es esto lo que estas tratando de hacer?

#include <stdio.h>

int main()
{
    int integer_1 = 12321;
    unsigned char* p = (unsigned char*)&integer_1;
    
    for (int i=0; i<sizeof(int); i++){
        printf("Address: %p -> Value: %02hhx\n", p+i, *(p+i));
    }
    return 0;
}

EDITAR: Como se señala por KPCT, el trabajo con void* es posible, solo un poco más tedioso si también está interesado en el valor puntiagudo, y no solo la dirección.

Por ejemplo, adaptar mi solución anterior para usar Void *, resultaría en algo como este

#include <stdio.h>

int main()
{
    int integer_1 = 12321;
    void* p = (void*)&integer_1;
    
    for (int i=0; i<sizeof(int); i++){
        printf("Address: %p -> Value: %02hhx\n", p+i, *((char*) p+i));
    }
    return 0;
}

Donde tendrías que pasar por el reparto a char * de todos modos

2
ozerodb 29 may. 2021 a las 14:44

Tendría que lanzar el puntero int a un puntero char (o un puntero int8_t), luego pasa a través de cada uno de los bytes, algo así:

char *cp = (char*)&integer_1;
for (int i = 0; i < sizeof(integer_1); ++i)
    printf("Address of integer_1, byte %d: %p\n",i,cp++);
2
SGeorgiades 29 may. 2021 a las 14:23