포인터 malloc 및 free 후 포인터 초기화 예시

jahlee·2023년 1월 11일
0

개인 공부

목록 보기
4/23
#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);
}

0개의 댓글