https://www.youtube.com/watch?v=_1PiJAjB7Io&list=PLRx0vPvlEmdDNHeulKC6JM25MmZVS_3nT&index=20
동빈나 님의 유튜브를 참고하였습니다. 동적 메모리 할당은 성능(공간적 복잡도)을 결정짓는 매우 중요한 c언어의 기술이기 때문에 복습을 해봤습니다.
들어가면서
C 언어에서 구조체 배열을 동적으로 생성하고 활용하는 방법을 간단한 예제를 통해 살펴보자.
우선 예제의 전체 코드이다.
이 코드는 정적인 배열이 아닌, `런타임에 크기를 결정해서 구조체 배열을 사용하는` 전형적인 예제이다.
이를 통해 프로그램 실행 중 필요한 만큼 구조체 데이터를 처리할 수 있어 유연한 데이터 관리가 가능해진다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book
{
int number;
char title[100];
};
void showBook(struct Book *p, int n) {
for (int i = 0; i < n; i++) {
printf("번호 %d : %s\n", (p + i)->number, (p + i)->title);
}
}
int main() {
struct Book* p;
p = (struct Book*)malloc(2 * sizeof(struct Book));
if (p == NULL) {
printf("동적 메모리 할당에 실패했습니다.\n");
exit(1);
}
p->number = 1;
strcpy(p->title, "C Programming");
(p + 1)->number = 2;
strcpy((p + 1)->title, "Data Structure");
showBook(p, 2);
free(p);
}
//번호 1 : C Programming
//번호 2 : Data Structure
📌 핵심 포인트 정리
1. 구조체 정의
struct Book {
int number;
char title[100];
};
책 정보를 담기 위한 구조체를 정의했다. 책 번호(number)와 책 제목(title)을 저장하는 단순한 구조다.
2. 구조체 배열 동적 할당
p = (struct Book*)malloc(2 * sizeof(struct Book));
Book 구조체를 2개 담을 수 있는 메모리를 동적으로 할당하고, 그 주소를 포인터 p에 저장했다.
이렇게 하면 구조체 배열처럼 p[0], p[1] 형태로 접근하거나 포인터 연산인 *(p + i) 또는 (p + i)->멤버로 접근할 수 있다.
💡 malloc은 void 포인터를 반환하므로 명시적 형변환을 해주었다. C++에서는 꼭 필요하지만, C에서는 없어도 컴파일은 가능하다.
3. 구조체 멤버에 값 할당
p->number = 1;
strcpy(p->title, "C Programming");
p[0] 요소에 접근하는 코드이다. -> 연산자를 사용하면 포인터로 구조체 멤버에 접근할 수 있다.
(p + 1)->number = 2;
strcpy((p + 1)->title, "Data Structure");
두 번째 구조체, 즉 p[1]에 해당하는 요소를 초기화한다.
4. 구조체 배열 출력 함수
void showBook(struct Book *p, int n)
이 함수는 구조체 배열을 포인터로 받아서 전체 책 정보를 출력해주는 역할을 한다.
(p + i)->멤버 방식으로 포인터 연산을 이용해 각 요소에 접근하고 있다.
5. 메모리 해제
free(p);
동적으로 할당한 메모리는 사용 후 반드시 free로 해제해줘야 한다.
해제하지 않으면 메모리 누수가 발생할 수 있다.
마무리
이 예제를 통해 구조체 배열을 동적으로 할당하고 초기화하는 전반적인 과정을 배울 수 있었다.
실제 프로젝트에서는 입력 개수가 유동적인 경우가 많기 때문에, 이 패턴은 꽤 자주 쓰이게 된다.
'Programming Language > C' 카테고리의 다른 글
[C/C++] Visual Studio2019 에서 헤더 파일 만들고 사용하기 (0) | 2022.02.27 |
---|---|
[c][c언어] 동적 메모리 2차원 배열의 좋은 예제 (0) | 2021.07.15 |