calloc()을 이용한 할당
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 36번째.
malloc()은 동적 메모리 할당을 위한 가장 일반적인 함수이지만, C는 또 다른 유용한 대안인 calloc()을 제공합니다. "contiguous allocation"(연속 할당)의 약자인 calloc() 함수는 중요한 추가 이점과 함께 배열을 위한 메모리를 할당하는 편리한 방법을 제공합니다.
단일 인자(총 바이트 수)를 받는 malloc()과 달리, calloc()은 할당하려는 요소의 개수와 각 요소의 크기라는 두 개의 인자를 받습니다. 이는 배열을 다룰 때 특히 직관적입니다. 예를 들어:
#include <stdlib.h>
// calloc()을 사용하여 정수 5개를 위한 공간 할당
int *arr = (int*)calloc(5, sizeof(int));
// 이는 malloc(5 * sizeof(int))와 동일합니다calloc()의 주요 장점은 할당된 모든 메모리를 자동으로 0으로 초기화한다는 것입니다. malloc()을 사용하면 할당된 메모리에 이전에 저장되었던 임의의 값이 포함되지만, calloc()은 모든 바이트가 0으로 설정됨을 보장합니다. 이는 모든 정수는 0, 모든 부동 소수점은 0.0, 그리고 모든 포인터는 NULL이 됨을 의미합니다.
malloc()과 마찬가지로, calloc()은 할당된 메모리에 대한 포인터를 반환하거나 할당에 실패하면 NULL을 반환하므로, 항상 할당 실패 여부를 확인해야 하며 사용이 끝나면 메모리를 free()하는 것을 잊지 말아야 합니다.
챌린지
쉬움자동 0 초기화 기능이 있는 동적 메모리 할당을 위해 calloc() 사용법을 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 사용자로부터 할당할 정수의 개수를 나타내는 정수
size를 입력받습니다. calloc()을 사용하여size개의 정수 배열을 위한 메모리를 동적으로 할당합니다.- 메모리 할당이 성공했는지 확인합니다. 실패하면
Memory allocation failed!를 출력하고 프로그램을 종료합니다. - 할당에 성공하면
Memory allocated and initialized to zero!를 출력합니다. - 배열의 모든 초기 값이 0임을 보여주기 위해
Initial values: [value1] [value2] [value3] ...형식으로 출력합니다. - 사용자로부터
size개의 정수 값을 입력받아 할당된 배열에 저장합니다. - 업데이트된 모든 값을
Updated values: [value1] [value2] [value3] ...형식으로 출력합니다. - 모든 값의 합계를 계산하여
Sum: [value]형식으로 출력합니다. free()를 사용하여 메모리 할당을 해제합니다.- 정리가 완료되었음을 확인하기 위해
Memory freed!를 출력합니다.
calloc()과 free()를 사용하려면 <stdlib.h> 헤더를 포함해야 함을 기억하세요. 이 챌린지는 malloc()에 비해 calloc()이 갖는 주요 장점인 할당된 모든 메모리를 자동으로 0으로 초기화하는 기능을 보여줍니다.
예를 들어, 입력이 다음과 같다면:
3
10 20 30출력은 다음과 같아야 합니다:
Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!이 챌린지는 calloc()이 동적으로 할당된 배열에 대해 깨끗하고 예측 가능한 시작 상태를 제공하여, malloc()이 남길 수 있는 예측 불가능한 가비지 값을 제거하는 방법을 강조합니다.
치트 시트
calloc() 함수는 자동 0 초기화와 함께 동적 메모리 할당을 제공합니다.
구문:
void* calloc(size_t num_elements, size_t element_size);malloc()과의 주요 차이점:
- 두 개의 인자를 받습니다: 요소의 개수와 각 요소의 크기
- 할당된 모든 메모리를 자동으로 0으로 초기화합니다
- 배열 할당에 더 직관적입니다
사용 예시:
#include <stdlib.h>
// calloc()을 사용하여 5개의 정수를 위한 공간 할당
int *arr = (int*)calloc(5, sizeof(int));
// 이것은 malloc(5 * sizeof(int))와 동일합니다
// 하지만 모든 값은 0으로 보장됩니다malloc()과 마찬가지로, calloc()은 할당된 메모리에 대한 포인터를 반환하거나 할당에 실패하면 NULL을 반환합니다. 항상 할당 실패 여부를 확인하고, 작업이 끝나면 free()를 사용하여 메모리 할당을 해제하십시오.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
int main() {
int size;
// 배열의 크기를 입력받습니다
scanf("%d", &size);
// TODO: 아래에 코드를 작성하세요
// calloc()을 사용하여 배열에 메모리를 할당하세요
// 할당이 성공했는지 확인하세요
// 초기 값을 출력하세요 (0이어야 합니다)
// 입력 값을 읽고 저장하세요
// 업데이트된 값을 출력하세요
// 합계를 계산하고 출력하세요
// 할당된 메모리를 해제하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.