민혁이의 IT스토리

동적 메모리 할당 본문

C언어

동적 메모리 할당

FE_Minhyuk 2025. 10. 10. 11:40
파이썬을 즐겨쓰는 나는 이번에 C를 배우며
가장 불편했던 것은 배열의 크기를 미리 정의해야 한다는 점이였다.

int arr[n]; 
이처럼 변수를 이용해 실행 중에 배열 크기를 지정하려 하면 오류가 발생한다...

하지만 이번에 동적 메모리 할당(dynamic memory allocation) 을 새롭게 배우면서, 실행 중에도 자유롭게 메모리를 할당할 수 있다는 사실을 알게 되었다. 이 문법 덕분에 코드가 훨씬 유연해졌고, 그 내용을 기록해두기 위해 이렇게 블로그에 남긴다.



 


동적 메모리 할당


 

정의: 프로그램 실행 도중에 메모리를 직접 할당하고 해제하는 방법

필요성:

  •   정적 배열(int arr[10])은 크기가 고정되어 있어 런타임 중 변경 불가능
  •  사용자 입력 등 크기를 미리 알 수 없는 상황에서 유용

예시

// 정적 할당
int arr[10];  // 크기가 고정됨


int n = 10; // arr 크기 지정
// 동적 할당
int *arr = (int*)malloc(sizeof(int) * n);  // 실행 중 크기 지정 가능

 

동작 원리:

 

  1. 스택(Stack) 영역에 arr이라는 int형 포인터 변수가 생성된다.
  2. 힙(Heap) 영역에 malloc()을 통해 int형 크기(4바이트)만큼, 원하는 개수만큼 메모리가 순서대로 할당된다.
  3. arr 포인터는 힙 영역에서 가장 첫 번째 메모리의 주소를 저장한다.
  4. 따라서 arr[i]는 *(arr + i)와 같으며, 이는 힙 영역에서 i번째 정수 공간에 접근하는 것을 의미한다.

 


메모리 할당 함수들


 

함수 역할 초기화 여부
malloc() 지정한 크기만큼 메모리를 할당 초기화 안됨(쓰레기 값 담김)
calloc() 요소 개수와 크기를 지정해 할당 + 0으로 초기화 0으로 초기화
realloc() 이미 할당된 메모리 크기를 재조정 데이터 유지 가능
free() 사용이 끝난 메모리 해제  반드시 호출 필요

 

 

 

사용예시

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

int main() {
    int n;
    printf("원하는 배열 크기 입력: ");
    scanf("%d", &n);

    int *arr = (int*)malloc(sizeof(int) * n);
    if (arr == NULL) {
        printf("메모리 할당 실패!\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    free(arr);
    return 0;
}

 

 

 

주의할점

 

  • malloc()은 실패 시 NULL을 반환하므로 항상 확인해야 함
  • free()로 반드시 메모리를 해제해야 함 (메모리 누수 방지)
  • realloc() 사용 시, 기존 포인터가 덮어씌워지기 전에 NULL 체크 필요

 

 


마무리


동적 메모리 할당을 사용하면 프로그램의 유연성이 커지고, 사용자 입력에 따라 메모리 크기를 조절할 수 있다. 하지만 free()를 잊으면 메모리 누수가 발생할 수 있으므로, 할당과 해제를 세트로 기억하는 습관이 중요하다.

 

'C언어' 카테고리의 다른 글

포인터 배열& 배열 포인터  (4) 2025.10.09