본문 바로가기
Computer Science

[C언어] 구조체 배열, 구조체 포인터 배열

by DuncanKim 2022. 7. 19.
728x90

[C언어] 구조체 배열

 

1. 구조체 배열의 필요성

 

만약 2차원 좌표를 10개 만들어야 한다면?

struct Point2D{
    int x;
    int y;
};

// 구조체 변수 10개 선언
struct Point2D p1;
struct Point2D p2;
...
struct Point2D p10;

이렇게 반복 노가다를 하는 방법도 있겠지만, 수 천개의 구조체는 만들다가 인생이 다 가버릴지도 모른다.

일반 자료형과 같이 배열로 구조체를 만들면 되는 일을 굳이 이렇게 할 필요가 없다.

 

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

 

2. 구조체 배열 선언하기

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

 

 

위의 코드를 그림으로 나타내보면 이렇게 나타낼 수 있다.

구조체 배열에서 각 요소(하나의 구조체)에 접근하려면 [index]를 붙이면 되며, 각각의 멤버에 접근하기 위해서는 '.멤버이름'을 사용하면 된다.

 

 

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

 

구조체 요소가 한꺼번에 뭉쳐진 배열이 아니라 요소마다 메모리를 할당하고 싶을 수도 있다. 이때는 구조체 포인터 배열을 만들고 malloc()으로 각 요소에 메모리를 할당하면 된다.

구조체 포인터 배열은 포인터 변수 이름 뒤에 []를 붙인 뒤 크기를 설정한다.

 

struct Point2D *p[3];

 

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

 

 

 

구조체 배열과의 차이로는 p[0]에 메모리 주소가 들어있다는 점이다.

또한 구조체 요소의 멤버에 접근할 때, 각각 화살표 연산자를 쓰는 것, 온점을 쓰는 것이 다르다.

728x90

댓글