[07] 구조체 배열 (struct array)

구조체 배열 사용하기

참고 문헌 (Ch 53): https://dojang.io/mod/page/view.php?id=445

구조체 배열 선언하기

선언하는 방법: struct (구조체 이름) (변수 이름)[배열 크기];

선언한 구조체의 멤버에 접근하는 방법: (변수 이름)[인덱스].(멤버 이름)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

struct Point2D {
int x;
int y;
};

int main()
{
struct Point2D p[3]; // 크기가 3인 구조체 배열 생성

p[0].x = 10; // 인덱스로 요소에 접근한 뒤 점으로 멤버에 접근
p[0].y = 20;
p[1].x = 30;
p[1].y = 40;
p[2].x = 50;
p[2].y = 60;

printf("%d %d\n", p[0].x, p[0].y); // 10 20
printf("%d %d\n", p[1].x, p[1].y); // 30 40
printf("%d %d\n", p[2].x, p[2].y); // 50 60

return 0;
}

선언하는 동시에 초기화 하는 방법: 중괄호 안에 중괄호를 사용하여 멤버별 초기 값을 설정해줘야함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

struct Point2D {
int x;
int y;
};

int main()
{
// 구조체 배열을 선언하면서 초기화
struct Point2D p1[3] = { { .x = 10, .y = 20 }, { .x = 30, .y = 40 }, { .x = 50, .y = 60 } };
// struct Point2D p[3] = {0,}: 그냥 전체 다 0으로 초기화하는 방법

printf("%d %d\n", p1[0].x, p1[0].y); // 10 20
printf("%d %d\n", p1[1].x, p1[1].y); // 30 40
printf("%d %d\n", p1[2].x, p1[2].y); // 50 60

// 구조체 배열을 선언하면서 초기화
struct Point2D p2[3] = { { 10, 20 }, { 30, 40 }, { 50, 60 } };

printf("%d %d\n", p2[0].x, p2[0].y); // 10 20
printf("%d %d\n", p2[1].x, p2[1].y); // 30 40
printf("%d %d\n", p2[2].x, p2[2].y); // 50 60

return 0;
}

구조체 포인터 배열 선언하기

선언하는 방법: struct (구조체 이름) (*포인터이름)[크기];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일

struct Point2D {
int x;
int y;
};

int main()
{
struct Point2D *p[3]; // 크기가 3인 구조체 포인터 배열 선언

// 구조체 포인터 배열 전체 크기에서 요소(구조체 포인터)의 크기로 나눠서 요소 개수를 구함
for (int i = 0; i < sizeof(p) / sizeof(struct Point2D *); i++) // 요소 개수만큼 반복
{
p[i] = malloc(sizeof(struct Point2D)); // 각 요소에 구조체 크기만큼 메모리 할당
}

p[0]->x = 10; // 인덱스로 요소에 접근한 뒤 화살표 연산자로 멤버에 접근
p[0]->y = 20;
p[1]->x = 30;
p[1]->y = 40;
p[2]->x = 50;
p[2]->y = 60;

printf("%d %d\n", p[0]->x, p[0]->y); // 10 20
printf("%d %d\n", p[1]->x, p[1]->y); // 30 40
printf("%d %d\n", p[2]->x, p[2]->y); // 50 60

for (int i = 0; i < sizeof(p) / sizeof(struct Point2D *); i++) // 요소 개수만큼 반복
{
free(p[i]); // 각 요소의 동적 메모리 해제
}

return 0;
}