punteros puntero operaciones memoria lenguaje dinamica con cadenas aritmetica c pointers struct malloc free

operaciones - Lenguaje C: liberación de la memoria de punteros a struct



punteros c++ (4)

Cuando tu lo hagas

node1 = malloc(sizeof(NODE));

tienes algo como

+-------+ +-----------------------------+ | node1 | ---> | memory for a NODE structure | +-------+ +-----------------------------+

Después de la asignación node2 = node1 tienes en cambio esto:

+-------+ | node1 | -/ +-------+ / +-----------------------------+ >-> | memory for a NODE structure | +-------+ / +-----------------------------+ | node2 | -/ +-------+

En otras palabras, tiene dos punteros apuntando a la misma memoria.

Intentar llamar free utilizando cualquiera de las dos variables de puntero invalidará ambos punteros.

Digamos que he declarado un puntero a una estructura y lo asigno con malloc () usando esta definición

typedef struct node { int info; struct node *next; } NODE;

Luego, en algún lugar del código, le dije dos punteros

NODE *node1, *node2 = NULL; node1 = malloc(sizeof(NODE)); node2 = node1;

Mi pregunta es, ¿debería usar "free ()" para liberar node2 como lo hacen las personas siempre con node1 vía free (node1) . ¿Cuál es exactamente el efecto de la asignación node2 = node1;

Gracias.


node1 es un puntero, lo que significa que el valor de la misma es la dirección de la memoria virtual de la estructura asignada.

Asignar node2 = node1 simplemente copia esa dirección.

Como resultado, free(node1) y free(node2) son equivalentes.


Debería pasar la dirección devuelta por malloc() y familia a free() para liberar la memoria asignada.

En su caso, solo está asignando la dirección devuelta a otro puntero y utilizando eso en forma gratuita, lo que está bien.

No deberías hacer

node2 = node1; node2 = node2 +1; free(node2);

Entonces puedes usar uno de ellos en tu caso para liberar la memoria

free(node1) y free(node2) son iguales en tu caso


No liberas node1 ni node2 . Liberas la memoria que señalan.

Con eso en mente, debería quedar claro por qué solo debería llamar free una vez