동적 할당 - malloc()
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 32번째.
이제 프로그램 실행 중에 힙(heap)으로부터 메모리를 요청하는 주요 함수인 malloc()에 대해 배우게 될 것입니다. malloc() 함수는 "memory allocation"의 약자로, 컴파일 타임에 고정된 크기의 변수를 선언하는 대신 필요할 때 메모리를 동적으로 할당할 수 있게 해줍니다.
malloc() 함수는 하나의 인자를 받습니다: 할당하려는 바이트 수입니다. 이 함수는 할당된 메모리 블록에 대한 void 포인터를 반환하거나, 할당이 실패할 경우 NULL을 반환합니다. void 포인터를 반환하기 때문에, 이를 적절한 데이터 타입으로 형변환(cast)해야 합니다.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 정수 하나를 위한 메모리 할당
// ptr은 이제 정수를 저장할 수 있는 메모리 위치를 가리킵니다
malloc()의 주요 장점은 유연성입니다. 런타임에 필요한 정확한 양의 메모리를 요청할 수 있으며, 이 메모리는 명시적으로 해제할 때까지 사용 가능한 상태로 유지됩니다. 이는 프로그램이 실행될 때까지 얼마나 많은 메모리가 필요할지 알 수 없을 때 특히 유용합니다.
malloc()을 사용하려면 <stdlib.h>를 포함해야 함을 기억하고, 반환된 void 포인터를 작업 중인 데이터 타입에 맞게 항상 캐스팅하세요.
챌린지
쉬움힙(heap) 영역에 단일 정수를 생성하고 작업하기 위해 malloc()을 사용하여 동적 메모리 할당을 시연하는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
malloc()을 사용하여 정수 하나를 위한 메모리를 동적으로 할당합니다.- 반환된 void 포인터를 정수 포인터(integer pointer)로 형변환(cast)합니다.
- 사용자 입력으로부터 정수 값을 읽습니다.
- 역참조 연산자를 사용하여 입력된 값을 동적으로 할당된 메모리에 저장합니다.
- 저장된 값을
Stored value: [value]형식으로 출력합니다. - 동일한 메모리 위치에 해당 값의 제곱을 계산하여 저장합니다.
- 제곱된 값을
Squared value: [value]형식으로 출력합니다.
malloc()을 사용하려면 <stdlib.h> 헤더를 포함해야 함을 기억하세요. 프로그램은 힙에서 메모리를 요청하고, 이를 사용하여 데이터를 저장 및 조작하며, 포인터 연산을 통해 할당된 메모리로 작업하는 동적 메모리 할당의 기본 워크플로우를 보여주어야 합니다.
예를 들어, 사용자가 7을 입력하면 출력은 다음과 같아야 합니다:
Stored value: 7
Squared value: 49이 챌린지는 메모리가 컴파일 타임에 고정되지 않고 런타임에 요청되는 동적 메모리 할당의 기본 개념을 소개하며, 이를 통해 프로그램의 메모리 사용에 더 큰 유연성을 제공합니다.
치트 시트
malloc() 함수는 프로그램 실행 중에 힙(heap)에서 메모리를 동적으로 할당합니다. 할당할 바이트 수를 인자로 받으며, 할당된 메모리 블록에 대한 void 포인터를 반환하거나 할당에 실패하면 NULL을 반환합니다.
malloc()을 사용하려면 <stdlib.h>를 포함하세요:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // 정수 하나를 위한 메모리 할당주요 사항:
- 반환된 void 포인터를 항상 적절한 데이터 타입으로 형변환(cast)하세요
- 명시적으로 해제(free)할 때까지 메모리는 사용 가능한 상태로 유지됩니다
- 런타임에 정확한 메모리 양을 요청할 수 있는 유연성을 제공합니다
- 필요한 정확한 바이트 수를 결정하기 위해
sizeof()를 사용하세요
직접 해보기
#include <stdio.h>
#include <stdlib.h>
int main() {
// 입력 읽기
int input_value;
scanf("%d", &input_value);
// TODO: 아래에 코드를 작성하세요
// 1. malloc()을 사용하여 정수 하나를 위한 메모리 할당
// 2. 반환된 포인터를 int*로 형변환
// 3. 할당된 메모리에 입력값 저장
// 4. 저장된 값 출력
// 5. 같은 위치에 제곱을 계산하여 저장
// 6. 제곱된 값 출력
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.