할당 실패 확인
Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 34번째.
malloc()은 동적 memory allocation을 위한 강력한 도구이지만, 반드시 이해해야 할 중요한 사실이 있습니다. malloc()은 실패할 수 있습니다. 시스템에 사용 가능한 memory가 부족해지면 malloc()은 요청을 처리할 수 없으며, 유효한 memory 주소 대신 NULL을 반환합니다.
이는 malloc()을 사용할 때마다 반환된 포인터를 사용하기 전에 성공했는지 확인해야 한다는 뜻입니다. NULL 포인터를 사용하면 프로그램이 세그멘테이션 오류와 함께 충돌합니다.
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // 프로그램을 종료하거나 오류를 처리하세요
}
// 여기서 ptr을 안전하게 사용할 수 있습니다
*ptr = 42;이 NULL 검사는 선택 사항이 아니라 견고한 C 프로그램을 작성하는 데 필수적입니다. 현대 시스템에서는 메모리 할당 실패가 드물더라도, 특히 리소스가 제한된 환경이나 많은 양의 메모리를 요청할 때 발생할 수 있습니다. 전문적인 C 코드는 충돌을 방지하고 우아한 오류 처리를 제공하기 위해 항상 이러한 검사를 포함합니다.
챌린지
쉬움malloc()을 사용한 동적 memory allocation에서 적절한 error handling을 보여 주는 C program을 작성하세요. program은 다음을 수행해야 합니다.
- 저장할 integer의 number를 나타내는 integer
n을 사용자로부터 Read합니다 malloc()과sizeof()를 사용하여n개의 integer로 구성된 array를 위한 memory를 동적으로 allocate합니다- 반환된 pointer가
NULL인지 테스트하여 memory allocation이 successful했는지 Check합니다 - allocation이 failed하면
Memory allocation failed!를 Print하고 program을 종료합니다 - allocation이 succeeds하면
Memory allocation successful!을 Print합니다 - 사용자로부터
n개의 integer values를 Read하여 allocated array에 store합니다 - 모든 values의 sum을 계산하고 다음 형식으로 Print합니다:
Sum: [value] - 다음 형식으로 allocated된 total bytes를 Print합니다:
Bytes allocated: [value]
malloc()을 사용하려면 <stdlib.h> header를 include해야 합니다. allocated된 memory를 사용하기 전에 allocation failure를 Check하는 essential practice를 program에서 보여 주어야 합니다.
예를 들어 input이 다음과 같다면:
4
10 20 30 40output은 다음과 같아야 합니다:
Memory allocation successful!
Sum: 100
Bytes allocated: 16이 challenge는 dynamic memory allocation을 사용할 때 defensive programming이 갖는 critical importance를 강조하며, program이 예기치 않게 crash하는 대신 potential memory allocation failures를 graceful하게 handle하도록 합니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
int main() {
// 정수의 개수를 읽습니다
int n;
scanf("%d", &n);
// TODO: 여기에 코드를 작성하세요
// - malloc()을 사용하여 n개의 정수를 위한 메모리를 할당하세요
// - 할당이 성공했는지 확인하세요
// - 성공과 실패 경우를 모두 처리하세요
// - 정수를 읽고 저장하세요
// - Calculate the sum and bytes allocated
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러