Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 malloc 함수 완벽 정리: 동적 메모리 할당의 원리와 실전 예제

문제 상황

동적 메모리 할당(dynamic memory allocation) 함수를 사용하여 배열 요소를 입력받고, 저장된 요소들의 합계를 계산한 뒤 화면에 출력하는 C 프로그램을 작성해 보겠습니다.

malloc 함수란?

C 언어에서 malloc(memory allocation)은 표준 라이브러리 함수로, 프로그램 실행 중(런타임)에 필요한 만큼의 메모리를 바이트 단위로 할당하는 역할을 합니다.

malloc 함수는 다음과 같은 특징을 가집니다.

  • 할당된 메모리 블록의 시작 주소(기본 주소)를 가리키는 void 포인터를 반환합니다.
  • 할당된 메모리를 초기화하지 않고 그대로 반환하므로, 내부에는 쓰레기 값(garbage value)이 남아 있을 수 있습니다.
  • 요청한 크기의 메모리를 확보하지 못하면 NULL을 반환합니다.

함수 구문

void *malloc(size in bytes)

사용 예시

  • 정수형 포인터 선언 후 1000바이트 할당하기

    int *ptr;
    ptr = (int *) malloc(1000);
  • n개의 int 크기만큼 할당하기 (권장 방식)

    int *ptr;
    ptr = (int *) malloc(n * sizeof(int));

참고: 메모리가 부족하여 할당에 실패하면 NULL이 반환되므로, 반드시 반환값을 확인하는 것이 좋습니다.

전체 예제 코드

다음 예제는 사용자로부터 요소 개수를 입력받아 malloc으로 메모리를 동적으로 할당하고, 각 요소를 입력받아 합계를 구한 후, free()로 메모리를 해제했을 때 어떤 일이 일어나는지 보여줍니다.

#include<stdio.h>
#include<stdlib.h>

void main(){
    // 변수와 포인터, 합계(sum) 선언 //
    int numofe, i, sum = 0;
    int *p;

    // 사용자로부터 요소 개수 입력받기 //
    printf("Enter the number of elements : ");
    scanf("%d", &numofe);

    // malloc() 함수 호출 - 필요한 만큼 메모리 동적 할당 //
    p = (int *)malloc(numofe * sizeof(int));

    /* 메모리 할당이 성공적으로 이루어졌는지
       반드시 if문으로 검사해야 한다 */
    if (p == NULL){
        printf("Memory not available");
        exit(0);
    }

    // 요소 입력 및 합계 계산 //
    printf("Enter the elements : \n");
    for(i = 0; i < numofe; i++){
        scanf("%d", p + i);
        sum = sum + *(p + i);
    }

    printf("\nThe sum of elements is %d", sum);

    // free()로 메모리 해제 //
    free(p);

    // 해제된 메모리 영역 출력 - 쓰레기 값이 표시됨 //
    printf("\nDisplaying the cleared out memory location : \n");
    for(i = 0; i < numofe; i++){
        printf("%d\n", p[i]); // 쓰레기 값(garbage values)이 출력됨 //
    }
}

실행 결과

Enter the number of elements : 5
Enter the elements :
23
45
65
12
23

The sum of elements is 168
Displaying the cleared out memory location :
10753152
0
10748240
0
23

핵심 포인트 정리

  • malloc(n * sizeof(int)): 자료형 크기를 곱해주는 방식이 이식성 측면에서 안전하며 권장됩니다.
  • NULL 검사 필수: 메모리 할당 실패 가능성을 항상 염두에 두고 반환값을 확인해야 합니다.
  • free() 호출 후 주의: 메모리를 해제한 뒤 해당 공간에 접근하면 예측 불가능한 쓰레기 값이 출력되며, 이는 미정의 동작(undefined behavior)에 해당하므로 실제 코드에서는 피해야 합니다.
  • 메모리 누수 방지: 동적으로 할당한 메모리는 사용이 끝나면 반드시 free()로 해제하는 습관을 들여야 합니다.