Coding & Programming/C, C++

[C/C++] 동적으로 메모리 할당 하기(dynamic memory allocation : malloc(), calloc(), free() fu

mainCodes 2021. 2. 28. 08:46

[C/C++] 동적으로 메모리 할당 하기(dynamic memory allocation : malloc(), calloc(), free() functions example)

 

안녕하세요 JollyTree입니다. 

코딩을 하다보면 char buf[100];과 같이 버퍼의 크기를 미리 할당할 수 있지만, 동적으로 메모리를 할당했다가 해제해야 하는 상황이 아주 많이 발생합니다. 이 때 사용할 수 있는 대표적인 함수가 malloc(), calloc()함수입니다. 두 함수는 할당한 메모리를 초기화하느냐 그렇지 않느냐의 차이가 있으니, 참고하여 사용하면 좋을 것 같습니다.

malloc(), calloc()함수 호출 후의 메모리 상태 비교

buf1 = (char*)malloc(sizeof(char) * 50);  //코드 실행 후 메모리 상태

 

 

 

 

 



위 그림에서 보는 바와 같이 0x00983F18(buf1의 시작 주소)로부터 50바이트의 할당된 메모리 값이 알 수 없는 값(0xCD)으로 채워져 있는 것을 볼 수 있습니다. malloc()함수 호출 후 memset()함수를 이용하여 buf1 메모리를 0(NULL)으로 초기화가 가능합니다. 

예) memset(buf1, 0, 50);

buf2 = (char*)calloc(100, sizeof(char)); 코드 실행 후 메모리 상태

 

 

 

 

 

 

 


반면, 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(100sizeof(char)); // 100바이트 할당
    if (buf1 == NULL)
    {
        printf("메모리 할당 오류.\n");
        exit(0);
    }
    strcpy(buf2, "Hello World2");
    printf("buf2 = [%s]\n", buf2);
    free(buf2); //할당한 메모리 해제
     
    num = (int*)calloc(3sizeof(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):

 

 

 

 

 

 

 

 

참고) realloc()함수는 이미 할당된 메모리 블록의 크기를 재조정할 때 사용합니다.