C 구조체 포인터 배열 - sonkoni/Koni-Wiki GitHub Wiki

구조체 포인터 배열

배열의 요소가 구조체 포인터이다. 즉, 배열의 각 인덱스에 주소값이 담긴다.

구조체 포인터 배열 선언
    struct 구조체이름 *포인터이름[크기];

구조체 포인터 배열 멤버 접근
    배열[인덱스]->멤버

구조체 포인터 배열 멤버의 해제: 배열 순회하며 모두 해제
    for (int i = 0; i < 배열크기; i++) {
        free(포인터[i]);
    }

구조체 포인터 배열 만들기

#include <stdio.h>
#include <stdlib.h>  /* malloc, free */

struct Point2D {
    int x, y;
};

int main(int argc, char *argv[]) {
    struct Point2D *p[3]; // 크기가 3인 배열 속에 Point2D 구조체에 대한 포인터가 담긴다.

    // 배열을 순회하며 malloc 으로 메모리에 만들어진 구조체 포인터를 할당한다.
    int arrCount = sizeof(p) / sizeof(struct Point2D *); // 배열 갯수 구하기
    for (int i = 0; i < arrCount; i++) {
        p[i] = malloc(sizeof(struct Point2D));
    }

    // 인덱스로 요소에 접근하면 구조체포인터가 나온다. 여기서 `->` 로  멤버에 접근
    p[0]->x = 10; p[0]->y = 11;
    p[1]->x = 20; p[1]->y = 21;
    p[2]->x = 30; p[2]->y = 31;

    // 배열 출력
    printf("[0]: %d %d\n", p[0]->x, p[0]->y);
    printf("[1]: %d %d\n", p[1]->x, p[1]->y);
    printf("[2]: %d %d\n", p[2]->x, p[2]->y);

    // 메모리 해제 역시 배열을 순회하며 하나씩 다 해준다
    for (int i = 0; i < arrCount; i++) {
        free(p[i]);
    }
    return 0;
}
// [0]: 10 11
// [1]: 20 21
// [2]: 30 31

구조체 포인터 배열의 요소 멤버를 0으로 초기화

#include <stdio.h>
#include <stdlib.h>  /* malloc, free */
#include <string.h>  /* memset */

struct Point2D {
    int x, y;
};

int main(int argc, char *argv[]) {
    struct Point2D *p[3]; // 크기가 3인 배열 속에 Point2D 구조체에 대한 포인터가 담긴다.
    
    // 배열을 순회하며 malloc 으로 메모리에 만들어진 구조체 포인터를 할당한다.
    int arrCount = sizeof(p) / sizeof(struct Point2D *);
    for (int i = 0; i < arrCount; i++) {
        p[i] = malloc(sizeof(struct Point2D));
        // 요소 멤버를 0으로 초기화
        memset(p[i], 0x0, sizeof(struct Point2D));
    }
    
    // 배열 출력
    printf("[0]: %d %d\n", p[0]->x, p[0]->y);
    printf("[1]: %d %d\n", p[1]->x, p[1]->y);
    printf("[2]: %d %d\n", p[2]->x, p[2]->y);
    
    // 메모리 해제 역시 배열을 순회하며 하나씩 다 해준다
    for (int i = 0; i < arrCount; i++) {
        free(p[i]);
    }
    return 0;
}
// [0]: 0 0
// [1]: 0 0
// [2]: 0 0
⚠️ **GitHub.com Fallback** ⚠️