C & C++

[C언어] 동적 할당 원리 및 방법(malloc, calloc, realloc) 정리

jimmy_AI 2022. 11. 18. 00:19
반응형

C언어 동적 메모리 할당(Dynamic Memory Allocation)

동적 할당 원리, 정적 할당과의 비교

동적 할당을 다루기 전에 먼저 기본적인 정적 할당 방법을 살펴보겠습니다.

#include <stdio.h>

int main(){

// 배열 선언(정적 배열 선언)
int arr[5];

// 값 할당 예시
arr[0] = 1;
arr[1] = 3;
arr[2] = 5;

}

위와 같이 처음에 5칸으로 배열의 크기를 지정하여 선언하는 방식입니다.

 

이 경우에는 컴파일 단계에서 자동으로 메모리를 할당해 주는데요.

스택 영역에 메모리 공간을 배정받게 되어 고정된 칸 수만 가질 수 있습니다.

(쉽게 생각하면 스택 중간에서 갑자기 차지하는 공간을 늘리거나 줄이는 것이 쉬운 작업은

아니라는 것을 직감하실 수 있을 것입니다.)

 

이렇게 배열 내 메모리를 할당받을 경우 장단점은 다음과 같습니다.

 

장점 : 사용하지 않는 메모리 해제를 자동으로 해주어 누수 걱정이 거의 없다.

단점 : 필요한 메모리 양을 잘못 계산하여 너무 크게 할당받으면 메모리 낭비가 생기고

너무 작게 할당받은 경우에도 칸 수를 늘리는 것이 불가능하다.

 



 

이 때, 원하는 칸 수를 사용자가 직접 지정하여 할당받고,

중간에 칸 수를 자유자재로 변경할 수 있는 방법이 동적 할당입니다.

 

여기서는 운영 체제가 직접 관리하는 힙 영역 내에 별도의 공간을 할당받고

사용이 종료되면 사용자가 직접 메모리 해제를 해주어야 누수가 발생하지 않습니다.

 

(참고 : 스택 영역 힙 영역에 대한 상세한 차이는 아래의 사이트들을 참고해보세요.)

 

여기서는 동적 할당의 대표 함수들인 malloc, calloc, realloc의 사용 방법을

정리해보도록 하겠습니다.

 

반응형

 

malloc 함수

malloc 함수에서는 input으로 할당받을 메모리의 총 크기(바이트)를 받습니다.

int형 5칸 배열을 malloc 동적 할당으로 생성하는 예시 코드는 아래와 같습니다.

#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요

int main() {

    // int형 5칸 동적 할당(malloc)
    int *arr=(int*)malloc(sizeof(int)*5);
    
    for (int i = 0; i < 5; i++)
        printf("%d\n", arr[i]);
        free(arr); // 사용 종료 시 free 필수!
}

여기서 유의할 점

1. stdlib.h 파일 포함이 필요한 점

2. arr는 포인터 자료형이라는 점(동적 할당된 힙 영역의 주소를 저장합니다.)

3. 사용 종료 후에 arr 변수에 대하여 free 함수로 해제를 해주어야 누수가 방지되는 점

등을 고려해주셔야 합니다.

 

 

calloc 함수

calloc 함수는 malloc 함수와 사용법의 거의 유사한데요.

 

다만, input으로 칸 수, 각 칸의 크기를 따로 받는다는 점

(ex. int형 5칸인 경우 -> malloc(20) vs calloc(5, 4))

calloc은 초기값이 0으로 고정된다는 점 정도가 두 함수의 차이점입니다.

 

int형 5칸 배열을 calloc 동적 할당으로 생성하는 예시 코드는 다음과 같습니다.

#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요

int main() {

    // int형 5칸 동적 할당(calloc)
    int *arr=(int*)calloc(5, sizeof(int));
    
    for (int i = 0; i < 5; i++)
        printf("%d\n", arr[i]); // 0 출력
        free(arr); // 사용 종료 시 free 필수!
}

마찬가지로 사용 해제 시에는 free를 반드시 선언해주어야 합니다.

 

 

realloc 함수

자세히 보면 malloc과 calloc이 분명히 '동적' 할당이라고 했었지만,

얼핏 보면 실제로 사용되는 칸 수는 고정인 것처럼 보입니다.

 

그러나, 동적 할당의 경우 realloc 함수를 통하여 할당된 메모리의 크기를 변경할 수 있습니다.

 

사용 방법은 realloc(동적 할당 변수, 변경된 할당 메모리의 총 크기) 형태입니다.

메모리의 총 크기는 malloc 때의 input과 유사하게 작성해주시면 됩니다.

 

다음은 int형 5칸 동적 할당된 배열을 7칸으로 변경하는 코드의 예시입니다.

#include <stdio.h>
#include <stdlib.h> // stdlib.h 헤더 파일 필요

int main() {

    // 정수형 5칸 동적 할당(calloc)
    int *arr=(int*)calloc(5, sizeof(int));
    
    for (int i = 0; i < 5; i++)
        printf("%d\n", arr[i]);

    // 7칸으로 재할당 시도
    arr = (int*)realloc(arr, sizeof(int)*7);

    for (int i = 0; i < 7; i++)
          printf("%d\n", arr[i]);
          free(arr); // 사용 종료 시 free 필수!
}

이 경우도 사용 종료 시에는 free를 반드시 선언해주어야 메모리 누수를 막을 수 있습니다.