| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 그리디
- 프론트앤드
- frontend
- 프론트엔드
- BFS
- 정렬
- 혼자 공부해서 개발까지
- react
- 알고리즘 기초
- 백준
- Mini-React
- HTML기초
- html
- 프로그래머스
- 코딩
- 코딩테스트
- DFS
- CSS
- 크래프톤 정글
- js
- 알고리즘
- c언어
- Python
- 정글
- 해시
- 그래프
- Git
- javascript
- 개발자
- 팀프로젝트
Archives
- Today
- Total
민혁이의 IT스토리
동적 메모리 할당 본문
파이썬을 즐겨쓰는 나는 이번에 C를 배우며
가장 불편했던 것은 배열의 크기를 미리 정의해야 한다는 점이였다.
int arr[n];
이처럼 변수를 이용해 실행 중에 배열 크기를 지정하려 하면 오류가 발생한다...
하지만 이번에 동적 메모리 할당(dynamic memory allocation) 을 새롭게 배우면서, 실행 중에도 자유롭게 메모리를 할당할 수 있다는 사실을 알게 되었다. 이 문법 덕분에 코드가 훨씬 유연해졌고, 그 내용을 기록해두기 위해 이렇게 블로그에 남긴다.
동적 메모리 할당
정의: 프로그램 실행 도중에 메모리를 직접 할당하고 해제하는 방법
필요성:
- 정적 배열(int arr[10])은 크기가 고정되어 있어 런타임 중 변경 불가능
- 사용자 입력 등 크기를 미리 알 수 없는 상황에서 유용
예시
// 정적 할당
int arr[10]; // 크기가 고정됨
int n = 10; // arr 크기 지정
// 동적 할당
int *arr = (int*)malloc(sizeof(int) * n); // 실행 중 크기 지정 가능

동작 원리:
- 스택(Stack) 영역에 arr이라는 int형 포인터 변수가 생성된다.
- 힙(Heap) 영역에 malloc()을 통해 int형 크기(4바이트)만큼, 원하는 개수만큼 메모리가 순서대로 할당된다.
- arr 포인터는 힙 영역에서 가장 첫 번째 메모리의 주소를 저장한다.
- 따라서 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 |
|---|