C언어 구조체 배열
코딩C언어
읽는데 5분 소요
처음 쓰여진 날: 2026-03-19
마지막 수정일: 2026-03-21
조회수: 824
선수학습(1개)
요약
C언어 구조체 배열의 선언과 초기화, 바깥 중괄호 생략 패턴, 구조체 배열과 포인터 접근 방법을 알아봅니다. 임의 주소를 활용한 메모리 구조 이해와 포인터 추적 방법을 포함합니다.
구조체 배열이란? 쌩기초
구조체도 배열로 선언할 수 있습니다. 배열의 각 요소가 구조체인 형태입니다.
c
코드 하이라이팅 중...

임의 주소로 이해하기
시험장에서 구조체 배열 문제를 풀 때, 각 요소에 임의의 주소값을 부여하면 포인터 연산을 쉽게 추적할 수 있습니다.

- students[0]의 주소를 100, students[1]을 101, students[2]를 102로 정합니다.1
- 이렇게 주소를 정해두면
p++나p+1같은 포인터 산술을 숫자로 계산할 수 있습니다.
시험장 팁: 임의 주소 활용법
구조체 포인터 문제가 나오면 첫 번째 요소부터 100, 101, 102... 로 주소를 적어두세요. p+1 = 101처럼 숫자로 계산하면 실수를 줄일 수 있습니다.
바깥 중괄호 생략 기초
위 코드에서는 각 구조체 요소를 {}로 감쌌지만, C언어에서는 바깥 중괄호를 생략할 수 있습니다. 컴파일러가 구조체의 첫 번째 멤버부터 차례대로 값을 하나씩 채워 넣습니다.
아래는 위 섹션과 다른 구조의 Student를 사용하는 기출 예시입니다:
c
코드 하이라이팅 중...
컴파일러는 멤버 순서대로 값을 채웁니다. 이 Student 구조체가 name, score[3] 순서이므로:
| 값 | 분배 위치 | 이유 |
|---|---|---|
| "Kim" | s[0].name | 첫 번째 멤버(name)에 대입 |
{0xA0, 0xA5, 0xDB} | s[0].score | 두 번째 멤버(score 배열)에 대입 |
| "Lee" | s[1].name | s[0]이 다 채워졌으므로 s[1]로 이동 |
{0xA0, 0xED, 0x81} | s[1].score | s[1]의 두 번째 멤버에 대입 |
시험에서 자주 나오는 형태
기출문제에서는 바깥 중괄호를 생략한 형태가 출제된 바 있습니다. 멤버 순서를 확인하고 어디서 잘리는지 파악하는 것이 핵심입니다.
구조체 배열과 포인터 심화
구조체 배열의 특정 요소를 포인터로 가리킬 수 있습니다. 구조체 변수에 직접 접근할 때는 점(.)을 쓰지만, 포인터를 통해 접근할 때는 화살표(->)를 사용합니다.
c
코드 하이라이팅 중...
구조체와 포인터의 활용
구조체가 자기 자신을 가리키는 포인터를 멤버로 가지면 연결 리스트를 만들 수 있습니다. 자세한 내용은 연결 리스트 페이지를 참고하세요.

임의 주소로 포인터 추적하기
임의 주소를 활용하면 포인터가 어떤 구조체 요소를 가리키는지 명확하게 파악할 수 있습니다.

p = &students[1]이므로 p에는 주소 101이 저장됩니다.p->name은 주소 101에 있는 students[1]의 name 멤버 → "이영희"p->id는 주소 101에 있는 students[1]의 id 멤버 → 1002
포인터에 정수를 더하면 해당 개수만큼 다음 구조체 요소로 이동합니다:
| 포인터 표현 | 주소 계산 | 가리키는 요소 |
|---|---|---|
| p | 101 | students[1] |
| p - 1 | 101 - 1 = 100 | students[0] |
| p + 1 | 101 + 1 = 102 | students[2] |
c
코드 하이라이팅 중...
포인터 산술에서 주소가 1 증가하는 이유
구조체 포인터에 1을 더하면 실제 메모리에서는 구조체 크기만큼 이동합니다. 시험에서는 실제 바이트 수를 몰라도 다음 구조체 요소로 이동한다고 이해하면 됩니다.
정보처리기사 실기 대비 문제
Footnotes
-
100부터 시작하는 이유는 편의상입니다. 0부터 시작하면 배열 인덱스와 헷갈릴 수 있으므로 구분되는 숫자를 씁니다. ↩