동적할당: 두 판 사이의 차이
기술노트
편집 요약 없음 |
편집 요약 없음 |
||
1번째 줄: | 1번째 줄: | ||
=== [C] 동적 메모리 할당 (Dynamic Memory Allocation) === | |||
=== | ==== 동적 할당이란? ==== | ||
프로그램 실행 중에 '''동적으로 메모리를 할당'''하는 것을 의미하며, '''힙(Heap) 영역'''에 메모리를 확보한다. | |||
정적 메모리 할당(static allocation)과 달리, 실행 중 필요한 만큼 메모리를 확보할 수 있어 유연한 메모리 관리가 가능하다. | |||
프로그램 실행 중에 '''동적으로 메모리를 할당'''하는 것을 의미하며, '''힙(Heap) 영역'''에 메모리를 확보한다. | |||
==== 특징 ==== | ==== 특징 ==== | ||
* 동적 메모리 할당에는 <code>#include <stdlib.h></code> 헤더 파일이 필요하다. | |||
* 할당된 메모리는 '''free()''' 함수를 사용하여 명시적으로 해제해야 한다. | |||
* 메모리를 해제하지 않으면 '''메모리 누수(memory leak)'''가 발생할 수 있다. | |||
==== 주요 동적 메모리 관련 함수 ==== | |||
==== 메모리 관련 함수 ==== | |||
* '''malloc''' - 원하는 크기만큼 메모리를 할당 | |||
* <code>void* malloc(size_t size)</code> | |||
* 예: <code>malloc(sizeof(int) * 4)</code> → int형 4개만큼 메모리 할당 | |||
''' | * '''calloc''' - 메모리 할당과 동시에 0으로 초기화 | ||
* <code>void* calloc(size_t nelem, size_t elsize)</code> | |||
* 첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기 | |||
void | * '''realloc''' - 기존 메모리 블록의 크기를 변경 (확장 또는 축소) | ||
* <code>void* realloc(void* ptr, size_t size)</code> | |||
* 원래 데이터는 유지됨 | |||
* '''free''' - 동적으로 할당된 메모리를 해제 | |||
* <code>void free(void* ptr)</code> | |||
==== 예제 코드 ==== | ==== 예제 코드 ==== | ||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
int main(void) { | int main(void) { | ||
int arr[4] = { 4, 3, 2, 1 }; | int arr[4] = { 4, 3, 2, 1 }; | ||
int* pArr; | int* pArr; | ||
// 동적할당: int형 4개만큼 메모리 할당 | // 동적할당: int형 4개만큼 메모리 할당 | ||
pArr = (int*)malloc(sizeof(int) * 4); | pArr = (int*)malloc(sizeof(int) * 4); | ||
if(pArr == NULL) { | if (pArr == NULL) { | ||
printf("malloc error\n"); | |||
exit(1); | |||
} | |||
} | |||
for(int i = 0; i < 4; ++i) { | // 배열 복사 | ||
for (int i = 0; i < 4; ++i) { | |||
} | pArr[i] = arr[i]; | ||
} | |||
// | // 출력 | ||
for (int i = 0; i < 4; ++i) { | |||
printf("%d\n", pArr[i]); | |||
} | |||
// 메모리 해제 | |||
free(pArr); | |||
return 0; | |||
} | } | ||
</syntaxhighlight> | |||
==== 코드 설명 ==== | ==== 코드 설명 ==== | ||
* <code>(int*)</code>: malloc은 반환형이 <code>void*</code>이므로 <code>int*</code>로 형 변환 | |||
* <code>sizeof(int)</code>: int형의 바이트 크기 (일반적으로 4바이트) | |||
* <code>malloc(sizeof(int) * 4)</code>: int형 변수 4개 분량의 메모리 확보 | |||
* <code>free(pArr)</code>: 사용이 끝난 후 반드시 메모리 해제 | |||
==== 정리 ==== | |||
동적 메모리 할당은 메모리를 유동적으로 사용하는 데 매우 유용하지만, 해제를 잊으면 시스템 성능 저하나 오류를 유발할 수 있다. 따라서 메모리를 적절히 할당하고, 사용 후 반드시 <code>free()</code>로 해제하는 습관이 중요하다. | |||
free( |
2025년 5월 15일 (목) 15:01 기준 최신판
[C] 동적 메모리 할당 (Dynamic Memory Allocation)
동적 할당이란?
프로그램 실행 중에 동적으로 메모리를 할당하는 것을 의미하며, 힙(Heap) 영역에 메모리를 확보한다. 정적 메모리 할당(static allocation)과 달리, 실행 중 필요한 만큼 메모리를 확보할 수 있어 유연한 메모리 관리가 가능하다.
특징
- 동적 메모리 할당에는
#include <stdlib.h>
헤더 파일이 필요하다. - 할당된 메모리는 free() 함수를 사용하여 명시적으로 해제해야 한다.
- 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있다.
주요 동적 메모리 관련 함수
- malloc - 원하는 크기만큼 메모리를 할당
*void* malloc(size_t size)
* 예:malloc(sizeof(int) * 4)
→ int형 4개만큼 메모리 할당
- calloc - 메모리 할당과 동시에 0으로 초기화
* void* calloc(size_t nelem, size_t elsize)
* 첫 번째 인자: 요소 개수, 두 번째 인자: 요소 크기
- realloc - 기존 메모리 블록의 크기를 변경 (확장 또는 축소)
* void* realloc(void* ptr, size_t size)
* 원래 데이터는 유지됨
- free - 동적으로 할당된 메모리를 해제
* void free(void* ptr)
예제 코드
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int arr[4] = { 4, 3, 2, 1 };
int* pArr;
// 동적할당: int형 4개만큼 메모리 할당
pArr = (int*)malloc(sizeof(int) * 4);
if (pArr == NULL) {
printf("malloc error\n");
exit(1);
}
// 배열 복사
for (int i = 0; i < 4; ++i) {
pArr[i] = arr[i];
}
// 출력
for (int i = 0; i < 4; ++i) {
printf("%d\n", pArr[i]);
}
// 메모리 해제
free(pArr);
return 0;
}
코드 설명
(int*)
: malloc은 반환형이void*
이므로int*
로 형 변환sizeof(int)
: int형의 바이트 크기 (일반적으로 4바이트)malloc(sizeof(int) * 4)
: int형 변수 4개 분량의 메모리 확보free(pArr)
: 사용이 끝난 후 반드시 메모리 해제
정리
동적 메모리 할당은 메모리를 유동적으로 사용하는 데 매우 유용하지만, 해제를 잊으면 시스템 성능 저하나 오류를 유발할 수 있다. 따라서 메모리를 적절히 할당하고, 사용 후 반드시 free()
로 해제하는 습관이 중요하다.