C언어

[C언어] 동적할당/malloc 함수

코딩 메모장 2024. 10. 16. 23:07
728x90

malloc 함수는 C와 C++에서 메모리를 동적으로 할당하는 데 사용되는 표준 라이브러리 함수입니다.

 

기본 사용법

#include <stdlib.h>

void* malloc(size_t size);

 

  • 매개변수:
    • size: 할당할 메모리 블록의 크기(바이트 단위).
  • 반환값:
    • 할당된 메모리 블록의 시작 주소를 가리키는 포인터. 할당에 실패하면 NULL을 반환합니다.

사용 예시

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

int main() {
    int *arr;
    size_t n = 5; // 5개의 정수 배열

    // 메모리 할당
    arr = (int*)malloc(n * sizeof(int));

    if (arr == NULL) {
        // 메모리 할당 실패
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 메모리 사용
    for (size_t i = 0; i < n; i++) {
        arr[i] = i + 1;
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 메모리 해제
    free(arr);

    return 0;
}

 

코드 설명

  1. #include <stdlib.h>: 동적 메모리 할당과 관련된 함수를 사용하기 위해 포함합니다.
  2. 동적 메모리 할당: malloc(n * sizeof(int))을 통해 5개의 정수를 저장할 수 있는 메모리를 동적으로 할당합니다.
  3. 메모리 사용: 할당된 메모리에 값을 저장하고 출력합니다.
  4. 메모리 해제: 사용이 끝난 메모리는 free를 사용하여 해제합니다.

주요 특징

  1. 동적 메모리 할당: 프로그램 실행 중에 필요한 만큼의 메모리를 유동적으로 할당할 수 있습니다.
  2. 초기화되지 않은 메모리: malloc으로 할당된 메모리는 초기화되지 않습니다. 메모리의 내용을 초기화하려면 calloc을 사용해야 합니다.
  3. 메모리 해제 필수: malloc으로 할당된 메모리는 사용 후 반드시 free를 호출하여 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.
  4. 타입 캐스팅: malloc은 void* 타입을 반환하기 때문에 적절한 타입으로 캐스팅해야 합니다. 예: (int*)malloc(...).
int *arr = (int*)calloc(n, sizeof(int)); // 메모리를 0으로 초기화합니다.

realloc 함수 - 메모리 크기 조정

동적 메모리 할당 후 크기를 변경해야 할 경우, realloc 함수를 사용할 수 있습니다. realloc은 기존 메모리 블록을 새 크기로 확장하거나 축소하는 데 유용합니다.

int *arr = (int*)malloc(n * sizeof(int));  // 초기 할당
arr = (int*)realloc(arr, new_size * sizeof(int));  // 메모리 크기 조정
  • 매개변수: 기존 메모리 블록을 가리키는 포인터와 새로 할당할 메모리 크기.
  • 반환값: 새로 할당된 메모리 블록의 포인터. 이전 데이터는 보존됩니다.

메모리 관리의 중요성

메모리를 동적으로 할당할 때, 항상 할당된 메모리를 적절히 해제하는 것이 중요합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다. 이를 방지하기 위해 항상 아래의 규칙을 따르세요:

  • 할당된 메모리는 사용 후 반드시 free로 해제: 메모리 누수를 방지하는 기본적인 원칙입니다.

또한, 대형 프로젝트에서는 메모리 관리 도구를 사용하는 것이 유용할 수 있습니다. 예를 들어, Valgrind 같은 메모리 디버깅 도구를 통해 메모리 누수 여부를 확인할 수 있습니다.

요약

  1. malloc 함수는 메모리를 동적으로 할당하여 프로그램 실행 중에 필요한 메모리 공간을 확보합니다.
  2. 할당된 메모리는 초기화되지 않으므로 필요하다면 calloc으로 초기화할 수 있습니다.
  3. 메모리 해제는 free 함수를 사용하며, 메모리 관리가 잘못되면 메모리 누수가 발생할 수 있습니다.
  4. realloc 함수를 사용하면 이미 할당된 메모리 크기를 유동적으로 변경할 수 있습니다.
728x90