Skip to content

Instantly share code, notes, and snippets.

@RaniAgus
Created April 27, 2022 23:55
Show Gist options
  • Select an option

  • Save RaniAgus/be77e23797dd0651b3e301094f9486c6 to your computer and use it in GitHub Desktop.

Select an option

Save RaniAgus/be77e23797dd0651b3e301094f9486c6 to your computer and use it in GitHub Desktop.
Diferencia entre "pisar" y "rellenar" un puntero

Diferencia entre "pisar" y "rellenar" un puntero

Thread original: sisoputnfrba/foro#2224 (comment)

Veamos el siguiente ejemplo:

int a = 0;
a = 1;

En este caso, yo estoy declarando una variable en 0 y luego "piso" ese valor a 1.

Entonces, tengamos las siguientes consideraciones:

  • Un puntero es básicamente un número entero como cualquier otro, solo que tiene la particularidad de que indica una dirección en memoria (normalmente lo representamos en hexa xq es más cómodo: 0x1234, 0x4567, etc).
  • malloc() reserva memoria en el heap (a.k.a memoria dinámica) y devuelve un puntero hacia el primer byte en donde empieza, o sea, no es que devuelve el cacho de memoria que reservó, sino que devuelve solo un número entero que indica en dónde ir a buscarlo.
  • list_find() también devuelve un puntero, en este caso, hacia el primer byte del struct t_tripulante_a_planificar que esté guardado en la lista y cumpla con la condición que recibe por parámetro (si no lo encuentra, devuelve NULL, o sea, 0x0).

Entonces, volviendo al ejemplo, si asumimos que malloc() devuelve 0x1234 y list_find() devuelve 0x4567, estarías haciendo lo siguiente:

t_tripulante_a_planificar* tripulante_buscado = 0x1234;
// ...
tripulante_buscado = 0x4567;

Que sería lo mismo que vimos arriba con el int.

Entonces, (por más que no sea el caso) si quisieras "rellenar" lo que está en 0x4567 dentro de 0x1234 como mencionaba Nico, lo adecuado sería hacer un memcpy:

t_tripulante_a_planificar* tripulante_buscado = malloc(...); // devuelve 0x1234

// ...

t_tripulante_a_planificar* tripulante_en_lista = list_find(...); // devuelve 0x4567

memcpy(tripulante_buscado, tripulante_en_lista, sizeof(t_tripulante_a_planificar)); 
// sería hacer memcpy(0x1234, 0x4567, sizeof(t_tripulante_a_planificar));
// o sea, rellenar dentro de 0x1234 una copia de lo que está en 0x4567

return tripulante_buscado; // retornamos la copia
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment