Puntero guardado en un entero

Leyendo el bootloader de FreeBSD, vi en el código:

struct gen_fb {
	uint64_t	fb_addr;
	uint64_t	fb_size;
	uint32_t	fb_height;
	uint32_t	fb_width;
	uint32_t	fb_stride;
	uint32_t	fb_mask_red;
	uint32_t	fb_mask_green;
	uint32_t	fb_mask_blue;
	uint32_t	fb_mask_reserved;
	uint32_t	fb_bpp;
};

El miembro fb_addr es dónde guarda la dirección de memoria a la memoria de video.

En un uint64_t, no un puntero, guardado en algo así como un unsigned long int.

Por lo que me entro la duda, y lo probe:

#include <stdio.h>
#include <stdint.h>


int main()
{
	int numero = 64;
	const uint64_t int_addr = (uint64_t)&numero;
	int *ptr_num = (int*)int_addr;
	printf("%d %d %p %p %p %d\n",numero,*ptr_num,int_addr,ptr_num,&numero,*((int*)int_addr));
	return 0;
}

Cómo se puede ver, parace una forma “segura” de guardar un puntero, y que no cambie por error.

3 Me gusta