본문 바로가기
C/C언어 코딩도장

UNIT 53 구조체 배열 사용하기

by yeong1225 2022. 3. 12.

53.0 구조체 배열 사용하기

일반 자료형과 마찬가지로 구조체도 배열로 만들면 편리함.

struct Point2D p[3000]; // 요소가 3,000개인 구조체 배열 선언

53.1 구조체 배열 선언하기

구조체 배열은 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정.

 

-struct 구조체이름 변수이름[크기];

#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;
}

-배열[인덱스].멤버

참고 ) 구조체 배열을 선언하는 동시에 초기화 하기

  • struct 구조체이름 변수이름[크기] = { { .멤버이름1 = 값1, .멤버이름2 = 값2 }, { .멤버이름1 = 값3, .멤버이름2 = 값4 } };
  • struct 구조체이름 변수이름[크기] = { { 값1, 값2 }, { 값3, 값4 } };
// 구조체 배열을 선언하면서 초기화
   struct Point2D p1[3] = { { .x = 10, .y = 20 }, { .x = 30, .y = 40 }, { .x = 50, .y = 60 } };
   struct Point2D p2[3] = { { 10, 20 }, { 30, 40 }, { 50, 60 } };

만약 모든 요소의 멤버를 0으로 초기화하고 싶다면 구조체 배열을 선언하면서 { 0, }을 할당하면 됨.

struct Point2D p[3] = { 0, }; //구조체 배열을 선언하면서 0으로 초기화

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

구조체 요소가 한꺼번에 뭉쳐져 있는 배열이 아닌 요소마다 메모리를 할당하고 싶을 수도 있음. 이때는 구조체 포인터 배열을 만들고 malloc 함수로 각 요소에 메모리를 할당하면 됨. 구조체 포인터 배열은 포인터 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정.

 

-struct 구조체이름 *포인터이름[크기];

#include <stdio.h>
#include <stdlib.h>

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;
}

배열 크기(요소 개수)만큼 반복하면서 각 요소에 구조체 크기만큼 메모리를 할당. 구조체 포인터 배열에는 포인터가 들어 있으므로 요소 개수를 구하려면 구조체 포인터 배열의 전체 크기에서 구조체 포인터의 크기로 나눠주면 됨.

sizeof(struct Point2D)는 구조체가 차지하는 크기, sizeof(struct Point2D *)는 구조체 포인터의 크기

 

구조체 포인터 배열에서 각 요소에 접근

-배열[인덱스]->멤버