#include <stdio.h>
#include <stdlib.h>
typedef struct s_list // 연결 리스트 구조체
{
int fd;
char *s;
struct s_list *next;
struct s_list *back;
}t_list;
void del_list(t_list **target, char *list_name)
{
printf("target의 주소 : %p\n",&target);
printf("target가 가리키는 주소(&%s) : %p\n",list_name,target);
printf("target가 가리키는 포인터가 가리키는 주소(%s) : %p\n",list_name,*target);
printf("free %s\n",list_name);
free(*target);
*target = NULL;
}
void connect_list(t_list *first, t_list *second)
{
printf("first가 가리키는 주소 : %p\n",first);
printf("second가 가리키는 주소 : %p\n",second);
first->next = second;
second->back = first;
}
void func()
{
static t_list *head;
t_list *tmp1;
t_list *tmp2;
head = (t_list *)malloc(sizeof(t_list));
head->s = (char *)malloc(sizeof(char)*10);
tmp1 = (t_list *)malloc(sizeof(t_list));
tmp1->s = (char *)malloc(sizeof(char)*10);
tmp2 = (t_list *)malloc(sizeof(t_list));
tmp2->s = (char *)malloc(sizeof(char)*10);
printf("head의 주소 : %p\n",&head);
printf("head가 가리키는 주소 : %p\n",head);
printf("tmp1의 주소 : %p\n",&tmp1);
printf("tmp1 가리키는 주소 : %p\n",tmp1);
printf("tmp2의 주소 : %p\n",&tmp2);
printf("tmp2 가리키는 주소 : %p\n",tmp2);
printf("--------------------------------------------------------------\n");
connect_list(head, tmp1);
connect_list(tmp1, tmp2);
printf("--------------------------------------------------------------\n");
del_list(&tmp1,"tmp1");
if(!tmp1) printf("freed well!!!\n");
}
int main()
{
func();
}
head의 주소 : 0x10665a020
head가 가리키는 주소 : 0x7f87da405820
tmp1의 주소 : 0x7ffee95ad978
tmp1 가리키는 주소 : 0x7f87da405850
tmp2의 주소 : 0x7ffee95ad970
tmp2 가리키는 주소 : 0x7f87da405880
--------------------------------------------------------------
first가 가리키는 주소 : 0x7f87da405820
second가 가리키는 주소 : 0x7f87da405850
first가 가리키는 주소 : 0x7f87da405850
second가 가리키는 주소 : 0x7f87da405880
--------------------------------------------------------------
target의 주소 : 0x7ffee95ad938
target가 가리키는 주소(&tmp1) : 0x7ffee95ad978
target가 가리키는 포인터가 가리키는 주소(tmp1) : 0x7f87da405850
free tmp1
freed well!!!
포인터로 가리키는 곳을 할당한 후에(tmp1이 가리키는 곳) free를 하고 tmp1이 NULL을 가리키도록 초기화를 해주어야 한다. 그렇기 때문에 del_list의 매개변수와 같이 투포인터의 형식으로 받아서 포인터가 가리키는 포인터가 가리키는 곳을 free해주고 포인터가 가리키는 포인터를 NULL로 초기화 시켜준다.
#include <stdio.h>
#include <stdlib.h>
void free_line(char **s)
{
if(*s)
{
free(*s);
printf("before freed pointing at %p\n",*s);
*s = NULL; // 주소를 받은 포인터가 가리키는 곳을 직접 수정해줄수도 있다.
}
}
int main()
{
char *tmp;
tmp = malloc(sizeof(char)*10);
printf("tmp : %s\n",tmp);
printf("tmp at %p\n",tmp);
free_line(&tmp);
printf("after freed pointing at %p\n",tmp);
}