C 언어에서 동적 메모리 할당은 프로그램 실행 중 필요한 메모리를 런타임에 동적으로 할당할 수 있게 해준다. 이 작업은 힙 메모리(Heap Memory)에서 이루어지며, 대표적으로 malloc()과 calloc() 함수가 사용된다.
1. malloc()
malloc()(Memory Allocation)은 메모리를 동적으로 할당하는 함수이다. 할당된 메모리는 초기화되지 않은 상태로 제공된다.
형태
void* malloc(size_t size);
- size_t size: 할당할 메모리 크기를 바이트 단위로 지정한다.
- 반환값: 성공 시 메모리의 시작 주소를 가리키는 포인터를 반환하며, 실패 시 NULL을 반환한다.
특징
- 초기화되지 않은 메모리를 할당하므로, 할당된 메모리의 값은 쓰레기 값(Garbage Value)을 포함할 수 있다.
- 메모리를 성공적으로 할당했더라도, 사용 후 반드시 free()를 호출해 메모리를 해제해야 한다.
사용 예시
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
// 정수 5개를 위한 메모리 할당
arr = (int*)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
// 배열 초기화 및 출력
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
printf("%d ", arr[i]);
}
// 메모리 해제
free(arr);
return 0;
}
2. calloc()
calloc()(Contiguous Allocation)은 malloc()과 유사하지만, 할당된 메모리를 0으로 초기화한다.
형태
void* calloc(size_t num, size_t size);
- size_t num: 할당할 요소의 개수.
- size_t size: 각 요소의 크기를 바이트 단위로 지정.
- 반환값: 성공 시 메모리의 시작 주소를 가리키는 포인터를 반환하며, 실패 시 NULL을 반환한다.
특징
- 메모리 할당과 동시에 모든 바이트를 0으로 초기화한다.
- 다차원 배열이나 초기화가 필요한 경우에 유용하다.
사용 예시
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
// 정수 5개를 위한 메모리 할당 및 초기화
arr = (int*)calloc(5, sizeof(int));
if (arr == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
// 초기화된 배열 출력
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // 모든 값이 0으로 초기화됨
}
// 메모리 해제
free(arr);
return 0;
}
3. malloc()과 calloc()의 차이점
특징malloc()calloc()
초기화 여부 | 초기화하지 않음 (쓰레기 값 포함) | 모든 메모리를 0으로 초기화 |
인자 형식 | 한 번에 전체 크기를 전달 | 요소 개수와 각 요소의 크기를 전달 |
속도 | 초기화 과정이 없으므로 더 빠름 | 초기화 과정이 있어 상대적으로 느림 |
사용 예 | 초기값이 필요하지 않은 데이터 처리 | 초기화가 필요한 배열이나 구조체 |
'개발 > C, C++' 카테고리의 다른 글
[C] C언어에서 힙 메모리와 스택 메모리 (0) | 2024.11.25 |
---|---|
[ C++ ] C++의 단짝 STL 🧏🏻♀️ (0) | 2024.01.13 |
[C++] C++ 입출력 속도를 더 빠르게 처리하는 방법 (0) | 2023.07.08 |
[C언어] 프로그래밍 개론/C언어 개론 (0) | 2023.06.23 |