동적 메모리(malloc)

김뉴오·2025년 5월 4일

키워드

목록 보기
7/15
post-thumbnail

복사로 메모리 할당하는데 어딜 복사할까?? => heap

동적 메모리 할당

C 언어에서는 일반적으로 컴파일 시점에 메모리를 할당하는 정적 메모리 할당과, 프로그램 실행 중 필요한 시점에 메모리를 할당하는 동적 메모리 할당

정적 메모리 할당 (Static Allocation)

int arr[10]; // 크기가 고정됨
  • 컴파일 시 크기가 정해짐
  • 배열 크기를 변경할 수 없음

동적 메모리 할당 (Dynamic Allocation)

int *arr = malloc(sizeof(int) * 10); // 런타임에 크기 결정
  • 실행 중 필요한 만큼 메모리를 할당할 수 있음
  • 유동적인 구조를 다룰 때 유용 (예: 연결 리스트, 트리, 가변 배열 등)

malloc – 메모리 할당

void* malloc(size_t size);
  • size만큼의 메모리를 할당만 하고 초기화는 하지 않음
  • 성공 시 해당 메모리의 시작 주소(포인터)를 반환, 실패 시 NULL 반환

예시

int *arr = malloc(sizeof(int) * 5);  // int 5개 크기의 메모리 할당
  • 이때 arr[0] ~ arr[4]는 초기화되지 않아 쓰레기값이 들어있음

calloc – 초기화된 메모리 할당

void* calloc(size_t n, size_t size);
  • n * size 만큼 메모리를 할당하고, 모든 바이트를 0으로 초기화
  • 배열 등 연속된 데이터를 0으로 초기화할 때 유용

예시

int *arr = calloc(5, sizeof(int)); // int 5개, 0으로 초기화

realloc – 메모리 크기 재조정

void* realloc(void* ptr, size_t new_size);
  • 이미 할당된 메모리(ptr)의 크기를 new_size만큼 재조정
  • 기존 데이터를 유지하면서 크기를 늘리거나 줄임
  • 필요 시 새 메모리 공간을 할당하고 기존 데이터를 복사한 후 ptr을 변경함

예시

arr = realloc(arr, sizeof(int) * 10); // 기존 arr를 10개 크기로 확장

주의 사항

  1. malloc, calloc, realloc성공 시 void* 포인터 반환 → 형변환 필요 없음 (C에서)
  2. 사용한 메모리는 반드시 free()로 해제해야 메모리 누수 방지
  3. realloc은 실패 시 NULL을 반환하므로 기존 포인터를 덮기지 말고 임시 포인터에 저장 후 검사하는 게 안전

함수역할초기화 여부사용 예시
malloc메모리 할당malloc(10 * sizeof(int))
calloc메모리 할당 + 0으로 초기화calloc(10, sizeof(int))
realloc메모리 크기 재조정유지realloc(ptr, new_size)
profile
Bello! NewOld velog~

0개의 댓글