[C/C++] 동적으로 메모리 할당 하기(dynamic memory allocation : malloc(), calloc(), free() functions example)
안녕하세요 JollyTree입니다.
코딩을 하다보면 char buf[100];과 같이 버퍼의 크기를 미리 할당할 수 있지만, 동적으로 메모리를 할당했다가 해제해야 하는 상황이 아주 많이 발생합니다. 이 때 사용할 수 있는 대표적인 함수가 malloc(), calloc()함수입니다. 두 함수는 할당한 메모리를 초기화하느냐 그렇지 않느냐의 차이가 있으니, 참고하여 사용하면 좋을 것 같습니다.
malloc(), calloc()함수 호출 후의 메모리 상태 비교
buf1 = (char*)malloc(sizeof(char) * 50); //코드 실행 후 메모리 상태
![](https://blog.kakaocdn.net/dn/cFUn4R/btqYN1TSu0t/3vqM78is79gYHRduAVokTk/img.png)
위 그림에서 보는 바와 같이 0x00983F18(buf1의 시작 주소)로부터 50바이트의 할당된 메모리 값이 알 수 없는 값(0xCD)으로 채워져 있는 것을 볼 수 있습니다. malloc()함수 호출 후 memset()함수를 이용하여 buf1 메모리를 0(NULL)으로 초기화가 가능합니다.
예) memset(buf1, 0, 50);
buf2 = (char*)calloc(100, sizeof(char)); 코드 실행 후 메모리 상태
![](https://blog.kakaocdn.net/dn/Wuxrs/btqYLAbcHMS/IjtrcIoyfnfAG0kY88ux20/img.png)
반면, malloc() 함수와는 다르게 calloc()함수를 사용한 경우 0x009886F0(buf2의 시작 주소)에 할당된 100바이트의 메모리가 모두 0(NULL)로 초기화 되어 있는 것을 확인 할 수 있습니다.
예제(Example):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char* buf1=NULL; char* buf2=NULL; int* num = NULL; buf1 = (char*)malloc(sizeof(char) * 50); // 50바이트 할당 if (buf1 == NULL) { printf("메모리 할당 오류.\n"); exit(0); } //memset(buf1, 0, 50); strcpy(buf1, "Hello World1"); printf("buf1 = [%s]\n", buf1); free(buf1); //할당한 메모리 해제 buf2 = (char*)calloc(100, sizeof(char)); // 100바이트 할당 if (buf1 == NULL) { printf("메모리 할당 오류.\n"); exit(0); } strcpy(buf2, "Hello World2"); printf("buf2 = [%s]\n", buf2); free(buf2); //할당한 메모리 해제 num = (int*)calloc(3, sizeof(int)); //정수 할당 int * 3 if (buf1 == NULL) { printf("메모리 할당 오류.\n"); exit(0); } num[0] = 100; num[1] = 101; num[2] = 102; for(int i=0; i<3; i++) printf("%d\n", num[i]); free(num); //할당한 메모리 해제 return 0; } | cs |
실행결과(Output):
![](https://blog.kakaocdn.net/dn/mMHId/btqYN2L20QF/KIFFitb9YURp9ZC8eDvD51/img.png)
참고) realloc()함수는 이미 할당된 메모리 블록의 크기를 재조정할 때 사용합니다.