1. 동적할당이란
- 프로그램이 실행되는 중에(런타임에) 필요한 만큼의 메모리를 할당받고 사용한 후 반환하는 기법.
- 일반변수나 배열은 컴파일 시점에 크기가 결정되지만, 동적할당은 프로그램 실행 중에 필요한 만큼만 메모리를 사용할 수 있어서 메모리를 효율적으로 관리할 수 있다.
- 메모리를 Stack이 아니라 Heap공간으로 할당받는 방법이다.
- 메모리를 Stack에 쌓으면 함수 안에서 선언된 지역 변수들은 함수가 끝나면 사라진다. 하지만 Heap에 쌓은 메모리는 free로 반환하기 전까지 사라지지 않는다.
1.1 스택 메모리와 힙 메모리
- 스택(Stack)메모리 : 자동으로 관리됨, 주로 지역변수와 매개변수 같은 것들이 저장된다. 속도는 빠르지만, 크기가 비교적 작고 생명 주기가 함수 호출과 종료에 딱 맞춰져 있다.
- 힙(Heap) 메모리 : 프로그래머가 직접 관리한다. 프로그램이 실행되는 동안 계속 유지되어야 할 데이터나, 크기가 유동적인 데이터를 저장할 때 쓴다. 속도는 스택보다 느리지만, 크기 제한이 거의 없고, 할당된 메모리는 free하기 전까지 사라지지 않는다.
2. 동적할당의 중요성
- 메모리 효율성 : 필요한 만큼만 메모리를 사용.
- 유연한 자료구조 : 연결 리스트, 트리 등의 구현 가능.
- 런타임에 크기 결정 : 사용자 입력에 따라 배열 크기 조절 가능.
3. 주의사항
- 메모리누수(Memory Leak) : 할당 후 free()를 안 하면 메모리가 계속 점유됨.
- 댕글링 포인터(Dangling Pointer) : free() 후에도 포인터를 사용하면 문제 발생.
- 이중 해제(Double Free) : 같은 메모리를 두 번 해제하면 오류 발생.
4. 동적할당의 주요 함수들
- malloc() : Memory Allocation의 약자로, 지정한 크기의 메모리를 할당하고 그 시작 주소를 반환한다.
- free() : malloc으로 할당받은 메모리를 운영체제에서 반환한다.
- calloc() : 메모리를 할당하고 0으로 초기화한다.
- realloc() : 이미 할당된 메모리 크기를 변경한다.
5. 동적할당 방법
- 기본형태 : 포인터변수 = malloc(필요한 바이트 크기);
- 여기서 필요한 바이트 크기는 그냥 숫자를 넣어도 되지만, 보통은 sizeof 연산자를 써서 데이터 타입의 크기에 필요한 개수를 곱해서 넣는다.
int *p = malloc(sizeof(int) * 5); // int 5개 크기만큼 할당
#include <stdio.h>
#include <stdlib.h>
int* change() {
int* arr = malloc(sizeof(int)*2);
int* p = arr;
p[0] = 200;
p[1] = 400;
return p;
}
int main(void) {
int* arr = change();
printf("arr[0] : %d\n", arr[0]);
printf("arr[1] : %d\n", arr[1]);
free(arr); // 메모리를 반납
return 0;
}'C언어 공부' 카테고리의 다른 글
| [C] time, rand, srand 함수 (0) | 2026.01.22 |
|---|---|
| c언어 정렬 함수 qsort 함수 (0) | 2025.09.22 |
| C언어 기초 - 13. 구조체의 개념 (1) | 2025.08.20 |
| C언어 기초 - 12. 문자열 배열과 문자열 포인터 (& C언어의 메모리 영역) (5) | 2025.08.16 |
| C언어 기초 - 11. scanf 표준입력함수의 개념 (0) | 2025.08.16 |