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