반응형

✅ C언어 동적 메모리 할당 완벽 가이드 – malloc부터 free까지 한 번에!
C언어의 핵심 중 하나는 바로 **동적 메모리 할당(Dynamic Memory Allocation)**입니다.
메모리를 **코드 실행 중(runtime)**에 직접 관리할 수 있어
배열 크기를 유연하게 설정하거나 데이터를 효율적으로 다룰 수 있습니다.
이번 강의에서는 malloc, calloc, realloc, free 함수에 대해
기초부터 예제까지 단계별로 배워봅니다.
📌 동적 메모리 할당이란?
프로그램 실행 중에 필요한 만큼 메모리를 요청하고, 더 이상 사용하지 않을 때 반납하는 방식
💡 왜 필요할까?
- 배열의 크기를 유연하게 설정하고 싶을 때
- 사용자 입력에 따라 메모리 크기를 동적으로 설정할 때
- 메모리 효율적 사용이 필요할 때
🧩 malloc 함수
void *malloc(size_t size);
- size: 할당할 바이트 크기
- 반환값: void 포인터 → 원하는 자료형으로 형변환 필요
✅ 사용 예시
int *arr = (int *)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
🧩 calloc 함수
void *calloc(size_t n, size_t size);
- n: 요소 개수, size: 한 요소의 크기
- 0으로 초기화된 메모리 블록을 할당함
✅ 예시
int *arr = (int *)calloc(5, sizeof(int));
🧩 realloc 함수
void *realloc(void *ptr, size_t new_size);
- 기존 메모리 블록을 새로운 크기로 재할당
- 주소가 바뀔 수도 있음 (주의!)
✅ 예시
arr = (int *)realloc(arr, 10 * sizeof(int));
🧨 free 함수
free(ptr);
- 동적으로 할당한 메모리를 반드시 해제해줘야 함
free(arr);
🛠 실전 예제: 사용자 입력에 따라 배열 크기 설정하기
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, *arr;
printf("몇 개의 정수를 입력할까요? ");
scanf("%d", &n);
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
for (int i = 0; i < n; i++) {
printf("%d번째 숫자 입력: ", i + 1);
scanf("%d", &arr[i]);
}
printf("입력된 숫자들: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
⚠️ 주의할 점
- malloc, calloc 이후에는 NULL 체크 필수
- 메모리를 사용한 후에는 반드시 free()로 해제
- free() 후 해당 포인터를 다시 사용하지 않도록 주의
🎯 실습 과제
- 사용자로부터 N개의 정수를 입력받고 평균 구하기
- calloc으로 2차원 배열처럼 사용할 수 있는 구조 만들기
- realloc을 이용해 배열 크기 확장하면서 누적합 계산하기
📘 핵심 요약
함수 설명malloc() | 초기화되지 않은 메모리 할당 |
calloc() | 0으로 초기화된 메모리 할당 |
realloc() | 기존 메모리 블록 크기 변경 |
free() | 메모리 해제 |
🗣 다음 주 예고: 함수 포인터와 콜백 함수 – 포인터의 실전 활용
포인터를 완전히 이해하려면 함수도 변수처럼 다루는 방법까지 가야 합니다.
다음 시간에는 함수 포인터, 그리고 콜백 함수 개념을 다뤄보겠습니다.
반응형
'C언어 > C 언어 중급' 카테고리의 다른 글
중급6강_C언어 문자열 함수 완전 정리 – 포인터로 문자열을 자유자재로 다루자! (0) | 2025.04.21 |
---|---|
중급5강_C언어 함수 포인터 완전정복 – 콜백 함수의 핵심 개념 쉽게 배우기! (0) | 2025.04.21 |
중급4강_C언어 포인터 배열과 2차원 배열 완전정복 – 메모리 구조 깊이 파헤치기! (0) | 2025.04.21 |
중급2강_C언어 포인터와 배열, 문자열 완전 이해하기 – 메모리 접근의 핵심 원리! (0) | 2025.04.20 |
중급1강_C언어 포인터(Pointer) 완전 정복! 메모리 주소와 참조를 한 번에 이해하자 (0) | 2025.04.20 |