Say I have declared a pointer to a struct and assign it with malloc() using this definition
typedef struct node {
int info;
struct node *next;
} NODE
When you do
node1 = malloc(sizeof(NODE));
you have something like
+-------+ +-----------------------------+ | node1 | ---> | memory for a NODE structure | +-------+ +-----------------------------+
After the assignment node2 = node1 you have instead this:
+-------+
| node1 | -\
+-------+ \ +-----------------------------+
>-> | memory for a NODE structure |
+-------+ / +-----------------------------+
| node2 | -/
+-------+
In other words you have two pointers pointing to the same memory.
Attempting to call free using either of the two pointer variable will invalidate both pointers.