개발지식/c c++

[c] 메모리 동적 할당과 할당 해제 함수 malloc calloc realloc free

개발자료맥시멈 2024. 6. 1. 16:46
반응형

동적할당 이란?

  • 동적할당 : 프로그램이 실행되는 중에 메모리를 할당하는 것을 가리켜 메모리를 동적으로 할당한다 라고 말합니다.
  • 프로그램에서 사용할 데이터의 크기를 미리 확정하지 못할 경우, 필요에 따라 메모리를 동적할당 하여 데이터를 저장할 수 있습니다.
  • c 언어는 메모리를 동적할당 하여 사용하고 난 후 직접 해제해 주어야 합니다.

 

 

함수 소개

void *malloc(size_t size);

  • 매개변수
    • size : 동적으로 할당하고 싶은 메모리 크기를 지정합니다. 단위는 바이트 입니다.
  • 반환값
    • 동적 할당에 성공하면 할당된 메모리의 시작 주소를 반환합니다. 실패하면  NULL을 반환합니다.  반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.

 

 

void *calloc(size_t number, size_t size);

  • 개요
    • malloc 함수처럼 메모리 동적할당 함수이지만, 매개변수로 받는 정보들을 가지고 메모리를 0으로 초기화 해준다는 특징이 있습니다. 이러한 특징은 배열을 할당할 때 유용합니다. 배열은 할당 후 0으로 초기화 해야하는 경우가 많기 때문입니다
  • 매개변수
    • number : 요소의 개수 입니다.
    • size : 요소의 크기 입니다.
  • 반환값
    • 동적 할당에 성공하면 할당된 메모리의 시작 주소를 반환합니다. 실패하면  NULL을 반환합니다.  반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.

 

 

void *realloc(void *memblock, size_t size);

  • 개요
    • 기존에 할당받은 메모리의 크기를 재조정합니다. 크기를 더 늘려야 할 필요가 있을 때 사용되곤 합니다. 사용하던 메모리를 조금 덜 사용할 때는, 재조정 하기보다 그냥 사용하지 않고 두었다가 사용이 완전히 끝나고 한번에 모든 메모리를 해제합니다.
  • 매개변수
    • memblock : 이전에 할당했던 메모리의 시작 주소입니다.
    • size : 새로 재조정 하고자 하는 메모리의 크기 입니다. 단위는 바이트 입니다. 
  • 반환값
    • 성공 시 재조정된 메모리의 시작주소를 반환합니다. 실패 시 NULL을 반환합니다.  반환받은 주소는 필요에 따라 다른 포인터 형식으로 변환하여 저장할 수 있습니다.

 

 

void free(void *memblock);

  • 개요
    • 할당받은 메모리를 해제합니다. c언어 프로그램은 실행 중 할당받은 메모리가 자동으로 해제되지 않습니다. 메모리 낭비를 막기 위해서는 프로그래머가 메모리를 잘 관리해야 합니다.
  • 매개변수
    • memblock : 해제할 메모리의 시작주소 입니다.
  • 주의
    • 할당되지 않은 공간을 해제하면 프로그램이 비정상 종료 되므로 잘 따져서 해제해야 합니다.

 

 

사용 예시

malloc 함수 사용예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <malloc.h>
 
int main()
{
    int *p_data;
    p_data = (int*)malloc(sizeof(int* 1);
    // malloc 가 성공했는지 확인한다.
    if (p_data != NULL) {
 
        // 여기서 p_data를 사용한다.
        *p_data = 10;
        printf("%d"*p_data);
 
        // malloc 함수로 메모리 할당에 성공한 경우에만
        // free함수를 호출하여 메모리를해제한다.
        free(p_data);
    }
    return 0;
}
 
 
 

 

 

calloc 함수 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <malloc.h>
int main()
{
    int *p_data;
 
    // int data[10] 배열을 동적할당하고
    // 0으로 초기화 한 것과 같다.
    p_data = (int*)calloc(10, sizeof(int));
    // 동적할당이 성공했는지 확인한다.
    if (p_data != NULL) {
 
        // 할당받은 공간을 출력하여 
        // 0으로 초기화 되었는지 확인한다.
        for (int i = 0; i < 10; i++) {
            printf("%d ", p_data[i]);
        }
 
        // 동적할당 메모리를 해제한다.
        free(p_data);
    }
    return 0;
}
 
 
 

 

 

realloc 함수 사용 예시
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
#include <stdio.h>
#include <malloc.h>
int main()
{
    int *p_data;
 
    p_data = (int*)malloc(sizeof(int* 3);
    // 동적할당이 성공했는지 확인한다.
    if (p_data == NULL) {
        return 0;
    }
    
    int dyn_alloc_size = _msize(p_data);
    printf("malloc size: %d\n", dyn_alloc_size);
 
    // realloc 함수가 실패할 경우 p_data에 NULL이 들어가며
    // 기존에 할당받았던 메모리의 주소를 잃게 된다.
    // 그것을 막기 위해 기존 주소를 p_old에 저장해 둔다.
    int *p_old = p_data;
    p_data = (int *)realloc(p_data, sizeof(int* 5);
    if (p_data != NULL) {
 
        // 할당받은 공간의 사이즈를 확인하여 출력한다.
        dyn_alloc_size = _msize(p_data);
        printf("realloc size: %d\n", dyn_alloc_size);
 
        // 동적할당 메모리를 해제한다.
        free(p_data);
    }
    else {
        free(p_old);
    }
 
    return 0;
}
 
 
 

 

 

 

반응형