null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
구조체 배열 선언과 초기화
#c
#struct
#array
#embedded
#initialization
@devpc
|
2026-05-04 12:39:59
|
GET /api/v1/nodes/441?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 구조체 배열 선언과 초기화 ## 왜 구조체 배열인가 개별 변수로 데이터를 관리하면 금방 한계가 온다. 학생 10명의 이름, 점수, 학번을 각각 배열로 나누면 인덱스 동기화가 틀릴 수 있다. 구조체 배열은 관련 데이터를 묶어서 한 단위로 처리한다. --- ## 기본 선언과 초기화 ```c #include <stdio.h> #include <string.h> typedef struct { int id; char name[32]; float score; } Student; int main(void) { /* 선언과 동시에 초기화 */ Student students[3] = { { 1, "Kim", 88.5f }, { 2, "Lee", 92.0f }, { 3, "Park", 75.3f } }; for (int i = 0; i < 3; i++) { printf("ID: %d | Name: %s | Score: %.1f\n", students[i].id, students[i].name, students[i].score); } return 0; } ``` --- ## 런타임 초기화 컴파일 타임에 값을 모를 때는 루프로 초기화하거나 `memset`으로 0을 채운다. ```c Student pool[10]; /* 방법 1: memset으로 전체 0 */ memset(pool, 0, sizeof(pool)); /* 방법 2: 루프 초기화 */ for (int i = 0; i < 10; i++) { pool[i].id = i + 1; pool[i].score = 0.0f; snprintf(pool[i].name, sizeof(pool[i].name), "User%d", i + 1); } ``` `memset(pool, 0, sizeof(pool))`은 정수 0과 부동소수점 `0.0f`를 모두 올바르게 초기화한다. 포인터 멤버가 있다면 이것만으로 NULL 초기화도 된다. --- ## 임베디드에서의 구조체 배열 MCU에서는 스택 크기가 제한적이므로 큰 배열은 전역 또는 `static`으로 선언한다. ```c /* 전역 선언 — BSS 영역 (초기값 0) */ static Student sensor_log[64]; static uint8_t log_count = 0; void log_sensor(int id, const char *name, float val) { if (log_count >= 64) return; /* 오버플로 방지 */ sensor_log[log_count].id = id; sensor_log[log_count].score = val; strncpy(sensor_log[log_count].name, name, 31); sensor_log[log_count].name[31] = '\0'; log_count++; } ``` --- ## 주의점 - 구조체 배열을 함수에 넘길 때 **배열 자체는 포인터로 전달**된다. 크기는 별도 인자로 함께 넘겨야 한다. - 문자열 멤버를 초기화할 때 `=` 연산자는 안 된다. `strcpy` 또는 `strncpy` 사용. - `sizeof(students)` vs `sizeof(Student)` 혼동 주의: 전자는 배열 전체 크기, 후자는 단일 구조체 크기.
// COMMENTS
Newest First
ON THIS PAGE