구조체의 동적 할당
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 48번째.
지금까지 여러분은 스택에 구조체(structs)를 생성하는 방법을 배웠습니다. 구조체는 선언된 스코프 내에서 존재하며 해당 스코프가 종료되면 자동으로 정리됩니다. 하지만 원래의 스코프를 벗어나서도 구조체가 유지되어야 하거나, 컴파일 타임에 얼마나 많은 구조체가 필요할지 알 수 없는 경우에는 어떻게 해야 할까요?
이 지점에서 동적 할당이 등장합니다. 다른 데이터 타입과 마찬가지로 malloc()을 사용하여 힙에 구조체를 생성할 수 있습니다. 주요 차이점은 동적으로 할당된 구조체는 free()를 사용하여 명시적으로 해제할 때까지 메모리에 남아 있다는 것입니다.
구조체를 동적으로 할당하는 구문은 다음과 같습니다:
struct Point *ptr = malloc(sizeof(struct Point));이것은 하나의 Point 구조체를 저장하기 위해 힙(heap)에 충분한 메모리를 할당하고, 그 메모리에 대한 포인터를 반환합니다. 그런 다음 화살표 연산자를 사용하여 구조체 멤버에 접근하고 수정할 수 있습니다:
ptr->x = 10;
ptr->y = 20;항상 malloc()이 성공했는지(NULL이 아닌 값을 반환했는지) 확인하고, 메모리 누수를 방지하기 위해 구조체 사용이 끝나면 free(ptr)를 호출해야 한다는 점을 기억하세요. 이 기술은 런타임에 데이터 구조를 생성하고 관리할 수 있는 유연한 프로그램을 구축하는 데 필수적입니다.
챌린지
쉬움malloc()을 사용하여 구조체의 동적 할당을 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 다음 멤버를 포함하는
Car라는 이름의struct를 정의합니다:- 제조 연도를 저장할 정수형
year - 자동차 브랜드를 저장할 크기 20의 문자 배열
brand - 자동차 모델을 저장할 크기 25의 문자 배열
model - 자동차 가격을 저장할 실수형
price - 자동차의 주행 거리를 저장할 정수형
mileage
- 제조 연도를 저장할 정수형
- main 함수에서
carPtr라는 이름의Car구조체 포인터를 선언합니다. malloc()을 사용하여 하나의Car구조체에 대한 메모리를 동적으로 할당하고 반환된 주소를carPtr에 할당합니다.- 메모리 할당이 성공했는지 확인합니다:
carPtr가NULL인 경우,Memory allocation failed를 출력하고 프로그램을 종료합니다.- 할당에 성공하면,
Memory allocation successful을 출력합니다.
- 다음 입력 값들을 읽고 화살표 연산자를 사용하여 구조체 멤버에 할당합니다:
- 연도를 위한 정수를 읽고
carPtr->year를 사용하여 할당합니다. - 브랜드를 위한 문자열을 읽고
carPtr->brand를 사용하여 할당합니다. - 모델을 위한 문자열을 읽고
carPtr->model를 사용하여 할당합니다. - 가격표를 위한 실수를 읽고
carPtr->price를 사용하여 할당합니다. - 주행 거리를 위한 정수를 읽고
carPtr->mileage를 사용하여 할당합니다.
- 연도를 위한 정수를 읽고
- 모든 값을 읽은 후, 화살표 연산자를 사용하여 다음 계산을 수행합니다:
- 2024에서 연도를 빼서 자동차의 나이를 계산합니다:
int age = 2024 - carPtr->year; - 나이에 따른 감가상각률을 계산합니다: 나이가 10보다 크면 감가상각률을 0.6으로 설정하고, 그렇지 않으면 0.8로 설정합니다.
- 현재 가치를 계산합니다:
carPtr->price * depreciation
- 2024에서 연도를 빼서 자동차의 나이를 계산합니다:
- 화살표 연산자를 사용하여 다음의 정확한 형식으로 자동차 정보를 출력합니다:
Car Information:Year: [year]Brand: [brand]Model: [model]Original Price: [price]Mileage: [mileage]Age: [age] yearsCurrent Value: [current_value]
free(carPtr)를 사용하여 동적으로 할당된 메모리를 해제합니다.Memory freed successfully를 출력합니다.
이 챌린지는 malloc()을 사용한 동적 구조체 할당, 할당 실패 확인, 화살표 연산자를 사용한 포인터를 통한 구조체 멤버 접근, 그리고 free()를 사용한 적절한 메모리 해제에 대한 이해도를 테스트합니다. 구조체를 사용한 동적 메모리 관리의 전체 라이프사이클을 연습하게 됩니다.
치트 시트
malloc()을 사용하여 힙에 구조체를 동적으로 할당합니다:
struct Point *ptr = malloc(sizeof(struct Point));화살표 연산자를 사용하여 포인터를 통해 구조체 멤버에 접근합니다:
ptr->x = 10;
ptr->y = 20;malloc()이 성공했는지 항상 확인하고, 사용이 끝나면 메모리를 해제하세요:
if (ptr == NULL) {
// 할당 실패 처리
}
// 구조체 사용...
free(ptr);직접 해보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO: 여기에 Car 구조체를 정의하세요
int main() {
// TODO: carPtr라는 이름의 Car 구조체 포인터를 선언하세요
// TODO: malloc()을 사용하여 Car 구조체 하나를 위한 메모리를 할당하세요
// TODO: 메모리 할당이 성공했는지 확인하세요
// 입력값 읽기
int year, mileage;
char brand[20], model[25];
float price;
scanf("%d", &year);
scanf("%s", brand);
scanf("%s", model);
scanf("%f", &price);
scanf("%d", &mileage);
// TODO: 화살표 연산자를 사용하여 입력값을 구조체 멤버에 할당하세요
// TODO: 차령, 감가상각 및 현재 가치를 계산하세요
// TODO: 요구된 형식으로 자동차 정보를 출력하세요
// TODO: 할당된 메모리를 해제하고 성공 메시지를 출력하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.