include
#include <stdlib.h> void *malloc(size_t size);
인자
- size
할당할 byte의 수
우리가 배열을 선언할 때 3칸이 필요하다! 4칸이 필요하다! 알 수 있으면 편하다.
하지만 얼마만큼이 필요한지 모를땐? 혹은 프로그램이 실행 도중에 더 큰 공간이 필요하게 된다면??
그럴때 malloc함수가 필요한 것이다. malloc
함수는 프로그램이 실행되는 도중에 상황에 따라 가변적
으로 메모리 공간을 사용하게 해 주는 동적할당을 해주기 때문에 프로그램 실행 당시에 얼마나 필요한지 몰라도 배열을 사용할 수 있다.
우선은 포인터 형식
의 변수를 선언해 주고 그 곳에 malloc으로 할당된 메모리공간의 주소
를 변수에 넣어주는 방식으로 사용이 되고 malloc()안의 값에 따라서 할당될 Byte수
가 정해진다. 이런 식으로 malloc함수는 메모리 공간을 할당해주고 그 할당된 메모리 공간의 주소를 void*
의 형태로 리턴을 해 주고 그 리턴된 값은 포인터변수 arr
에 저장이 된다.
왜 void*의 형태로 리턴이 될까??
이유는 변수가 모두 동일한 자료형
이 아니기 때문이다. int형태일수도 있고 double의 형태일수도 있고, 구조체일수도 있다. 이 자료형마다 해당되는 크기가 다르기
때문에 void*의 형태로 리턴을 해주는 것이다.
어? 맨 밑에 free는 뭐지??
이런 굉장히 편한 malloc에도 단점
은 있다. 바로 필요한 만큼 사용하고 사용이 끝나면 꼭 free를 통해서 할당을 해제
해 주어야 한다.
다른 대부분의 변수들은 자기가 속해있는 함수가 끝난다면 자동으로 메모리영역에서 삭제가 된다. 하지만 우리가 동적할당으로 메모리 공간을 할당해 준다면 함수가 끝나도 사라지지 않고 프로그램이 종료될 때까지 계속 메모리 공간에 남아있어서 자리를 차지하고 있게 된다.
이런 경우를 방지하고자 해당 메모리공간을 다 사용하고 나면 free함수를 통해서 메모리 공간을 해제해 주어야 한다.
물론 프로그램이 종료가 되면 OS는 할당된 메모리를 모두 해제한다고는 하지만 다양한 예외가 있으니 사용 다 하면 해제하기로 하자.
inlcude
#include <stdlib.h> void *calloc(size_t count, size_t size);
인자
- count
할당할 byte의 수- size
0으로 초기화 할 byte의 수.
malloc함수처럼 메모리공간을 동적할당
할 수 있는 함수이다. 단지 차이점
이 있다면 malloc은 할당된 공간이 쓰레기 값
으로 채워지지만 calloc은 size만큼 0으로 초기화
해주는 것이다. 당연하게도 calloc도 free를 해 주어야 한다.
이런 식으로 malloc은 쓰레기 값이 들어가 있지만 calloc은 0으로 초기화를 해준다.