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나는 것으로 확인하였음