구조체 배열은 C 언어에서 데이터 테이블, 점 배열, 직원 등의 동일 유형 데이터를 저장하고 처리하는 인기 있는 방법 중 하나입니다.
문제의 역사:
구조체와 배열의 지원은 C의 초기 버전에서 데이터 조직의 용이성을 위해 추가되었습니다. 그러나 구조체 배열 작업은 언어의 특성, 메모리 작업 및 데이터 전송 원칙에 대한 이해를 요구합니다.
문제:
구조체 배열의 초기화 오류, 메모리 혼동, 함수에 배열 전달 시(포인터로 전달될 수 있음), 잘못된 인덱싱을 통한 구조체 필드 접근 오류 등이 발생할 수 있습니다.
해결책:
.와 ->를 통해 이루어집니다.예시 코드:
#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].field는 arr[i]가 구조체인 경우 사용됩니다.
ptr->field는 ptr이 구조체에 대한 포인터인 경우 사용됩니다.
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
구조체 배열을 함수에 전달할 때 구조체의 복사본이 전달되나요?
아니요, 배열의 첫 번째 요소에 대한 포인터가 전달되어 함수가 원본 메모리에서 작업하면서 요소를 수정할 수 있습니다.
프로그래머가 구조체 배열을 선언하고 필드를 초기화하지 않은 상태로 배열을 함수에 전달했습니다. 포인터 작업에 -> 대신 . 연산자를 사용했습니다. 결과적으로 타입 오류가 발생하고 쓰레기 값을 사용하게 되었습니다.
장점:
단점:
전역 배열에 대해 명시적인 0 초기화 {0}를 사용하고, 함수는 포인터와 크기를 받아들였으며, 필드 접근은 엄격히 유형에 따라(arr[i].x) 수행되었습니다.
장점:
단점: