프로그래밍C 개발자

C 언어에서 구조체 배열 작업에 대해 자세히 설명해 주세요. 선언, 초기화, 함수 전달 및 사용 시 어떤 세부 사항이 발생하며, 실제로 자주 발생하는 오류는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

구조체 배열은 C 언어에서 데이터 테이블, 점 배열, 직원 등의 동일 유형 데이터를 저장하고 처리하는 인기 있는 방법 중 하나입니다.

문제의 역사:

구조체와 배열의 지원은 C의 초기 버전에서 데이터 조직의 용이성을 위해 추가되었습니다. 그러나 구조체 배열 작업은 언어의 특성, 메모리 작업 및 데이터 전송 원칙에 대한 이해를 요구합니다.

문제:

구조체 배열의 초기화 오류, 메모리 혼동, 함수에 배열 전달 시(포인터로 전달될 수 있음), 잘못된 인덱싱을 통한 구조체 필드 접근 오류 등이 발생할 수 있습니다.

해결책:

  1. 구조체 배열 선언 — 기본 유형 배열처럼 사전에 정의된 구조체 유형을 기반으로 진행됩니다.
  2. 배열 초기화 — 완전, 부분, 요소별 초기화가 가능하지만 구문을 엄격하게 지켜야 합니다.
  3. 사용 및 전달 — 기본적으로 배열은 함수에 포인터로 전달되며, 필드 접근은 .->를 통해 이루어집니다.

예시 코드:

#include <stdio.h> struct Point { int x; int y; }; void print_points(struct Point *arr, int size) { for(int i = 0; i < size; ++i) { printf("(%d, %d)\n", arr[i].x, arr[i].y); } } int main() { struct Point points[3] = { {1,2}, {3,4}, {5,6} }; print_points(points, 3); return 0; }

주요 특징:

  • 선언 시 구조체 유형을 미리 정의해야 합니다.
  • 구조체 배열을 함수에 전달할 때는 첫 번째 요소에 대한 포인터가 전달됩니다.
  • 목록 형식 또는 요소별로 초기화할 수 있으며, 올바른 값 입력을 지켜야 합니다.

속임수 질문.

배열에서 구조체 필드에 접근할 때 점과 화살표의 차이점은 무엇인가요?

arr[i].fieldarr[i]가 구조체인 경우 사용됩니다. ptr->fieldptr이 구조체에 대한 포인터인 경우 사용됩니다.

struct Point *p = &points[0]; printf("%d", p->x); // 올바름 // points[0].x도 올바릅니다.

구조체 배열의 부분 초기화 시 나머지 필드는 어떤 값이 되나요?

부분 초기화 시 지정되지 않은 필드는 정적으로 할당된 배열에서 0으로 채워지지만, 초기화되지 않은 자동(스택) 변수의 경우 적용되지 않습니다.

struct Point arr[2] = { {10} }; // arr[0].x = 10, arr[0].y = 0, arr[1].x 와 arr[1].y = 0

구조체 배열을 함수에 전달할 때 구조체의 복사본이 전달되나요?

아니요, 배열의 첫 번째 요소에 대한 포인터가 전달되어 함수가 원본 메모리에서 작업하면서 요소를 수정할 수 있습니다.

일반적인 오류 및 안티패턴

  • 초기화되지 않은 구조체 필드 사용.
  • 잘못된 인덱싱(예: points.x 대신 points[i].x).
  • 함수에서 로컬 구조체 배열 반환 시도.

실생활 예

부정적인 케이스

프로그래머가 구조체 배열을 선언하고 필드를 초기화하지 않은 상태로 배열을 함수에 전달했습니다. 포인터 작업에 -> 대신 . 연산자를 사용했습니다. 결과적으로 타입 오류가 발생하고 쓰레기 값을 사용하게 되었습니다.

장점:

  • 컴파일 가능한 코드를 얻고 컴파일러 오류를 경험했습니다.

단점:

  • 런타임에서 예상치 못한 버그가 발생하여 추적하기 어려운 문제였습니다.

긍정적인 케이스

전역 배열에 대해 명시적인 0 초기화 {0}를 사용하고, 함수는 포인터와 크기를 받아들였으며, 필드 접근은 엄격히 유형에 따라(arr[i].x) 수행되었습니다.

장점:

  • 초기화되지 않은 값이 없고 읽기 쉬운 코드입니다.

단점:

  • 초기화가 필요 없는 경우에도 시간이 걸리지만, 이는 가독성과 안전성을 보장합니다.