malloc / free / calloc에 대해

nhwang·2022년 1월 27일
0

malloc : 메모리 할당
free : 할당 해제

할당의 해제가 제대로 이루어졌는지 궁금해 실험 진행

int	main()
{
	char **arr;
	
	printf("before malloc arr P %p \n", arr);

	arr = (char **) malloc (sizeof(char *) * 3);
	arr[0] = (char *) malloc (sizeof(char)*7);
	arr[1] = (char *) malloc (sizeof(char)*4);
	arr[2] = (char *) malloc (sizeof(char)*6);

	arr[0][0] = 'h';
	arr[0][1] = 'e';
	arr[0][2] = 'l';
	arr[0][3] = 'l';
	arr[0][4] = 'o';
	arr[0][5] = 'w';
	arr[0][6] = '\0';

	arr[1][0] = 'n';
	arr[1][1] = 'e';
	arr[1][2] = 'w';
	arr[1][3] = '\0';

	arr[2][0] = 'w';
	arr[2][1] = 'o';
	arr[2][2] = 'r';
	arr[2][3] = 'l';
	arr[2][4] = 'd';
	arr[2][5] = '\0';

//////
	printf("arr P %p \n", arr);

	printf("origin %s \n",arr[0]);
	printf("origin pointer arr[0] %p \n",arr[0]);

	printf("origin %s \n",arr[1]);
	printf("origin pointer arr[1] %p \n",arr[1]);

	printf("origin %s \n",arr[2]);

	printf("arr change \n");
	arr[0][1]='z';
	printf("changed %s \n",arr[0]);
	
	free(arr);
	printf("----freeeeeeeee---- cheking can change...\n");
	printf("freed arr P %p \n", arr);

	arr[0][0] = 'a';
	arr[0][1] = 'b';
	arr[0][2] = 'c';
	arr[0][3] = 'd';
	arr[0][4] = 'e';
	arr[0][5] = 'f';
	arr[0][6] = '\0';

	arr[1][0] = 'g';
	arr[1][1] = 'h';
	arr[1][2] = 'i';
	arr[1][3] = '\0';

	arr[2][0] = 'j';
	arr[2][1] = 'k';
	arr[2][2] = 'l';
	arr[2][3] = 'm';
	arr[2][4] = 'n';
	arr[2][5] = '\0';
	
	printf("change after free : %s \n",arr[0]);
	printf("changed pointer arr[0] %p \n",arr[0]);

	printf("change after free : %s \n",arr[1]);
	printf("changed pointer arr[1] %p \n",arr[1]);

	printf("change after free : %s \n",arr[2]);
}

할당을 한 것에 대해서 free로 해제하더라도 값을 변경하는것이 가능한데, 이것과 관련된 개념이 "댕글링 포인터" >> 해제하기전에 널값으로 삽입해주어야 이슈가 생기지 않는다는 개념.

다만, 그렇게 되면 free가 대체 무슨소용인가 싶을 수 있으나,
말록인 상태의 메모리(free하지 않은 메모리)는 다른 말록이나 프로그램중 임의로 스택영역에 부여하는 등의 변수들과 주소가 겹치지 않게 도와줄 것으로 예상된다.

malloc arr~~~ >> 주소 a1~a10할당
free (arr) >> 앞으로 주소 a1~a10에 대한 임의 접근을 허용하겠다는 뜻
int a; >> 우연의 일치로 a1주소에 할당 할 수 있음.
free때 null을 넣어주지않았으면 초기화 되지 않는 등 예측불가한 결과가 발생.

free (arr)을 하지 않은 경우 >> int a;를 해도 같은 주소로 할당되지 않게 됌.

즉 free는 안에 값을 널로 채우는 것이 아니라, 다른 변수에서의 해당 주소로 메모리접근을 허용하겠다는 의미일 것이다.

calloc 함수 원형

void *ft_calloc(size_t count, size_t size)

용도 : malloc에 size까지 한 번에 받을 수 있도록 구현한 함수

-구현

#include "libft.h"

void	*ft_calloc(size_t count, size_t size)
{
	void	*answer;

	answer = malloc(count * size);
	if (!answer)
		return (NULL);
	ft_bzero(answer, count * size);
	return (answer);
}

free의 범위?


malloc 할당했던 것은 free해서 다시 접근해도 abort나지 않으나,
malloc 하지 않았던 것에 대해 free를 해서 다시 접근하는 경우 free하는 순간!
(할당한게 없는데 해제하라고 했으니...) 에는 abort이슈가 생긴다.
ㄴ> 맨 마지막 printf 주석처리해서 abort나는 것으로 확인하였음

profile
42Seoul

0개의 댓글