질문 역사
C 언어에서 다차원 배열은 표와 행렬 작업을 단순화하기 위해 처음 설계되었습니다. 전형적인 2차원 배열은 배열의 배열로, 표형 데이터의 요소를 간단한 구문으로 처리할 수 있는 기능을 제공합니다. 시간이 흐르면서 이 접근 방식은 특히 가변 길이 배열을 사용할 때 진화하였습니다.
문제
다차원 배열의 잘못된 선언과 초기화는 컴파일 오류나 논리적 충돌을 초래할 수 있습니다. 많은 개발자들은 다차원 배열을 함수에 전달할 때 사양 요구 사항때문에 혼란을 겪곤 합니다. 첫 번째 차원을 제외한 모든 차원의 크기를 명시해야 합니다.
해결책
2차원 배열 선언:
int matrix[3][4];
전체 초기화:
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
함수에 전달할 때 — 첫 번째를 제외한 모든 크기를 명시적으로 지정해야 합니다:
void printMatrix(int m[][3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ", m[i][j]); printf(" "); } }
C99 표준의 도입으로 가변 길이 배열을 받아들이는 함수 선언이 가능합니다:
void foo(int rows, int cols, int a[rows][cols]);
주요 특징:
1. 두 번째 크기를 명시하지 않고 2차원 배열을 받는 함수를 선언할 수 있습니까?
아니요, C는 모든 차원 크기(첫 번째를 제외하고)가 컴파일 단계에서 알려져 있어야 한다고 요구합니다. 이는 요소에 접근할 때 포인터 산술과 관련이 있습니다.
오류 예:
// 오류: void process(int arr[][], int rows); // 불가능
2. 다차원 배열의 모든 요소를 초기화하지 않으면 어떻게 됩니까?
남은 요소는 정적(static) 또는 전역(global) 배열일 경우 자동으로 0으로 채워집니다. 부분 초기화된 로컬 배열의 경우에도 초기화되지 않은 요소는 0으로 설정됩니다.
int a[2][3] = {{1}, {4}}; // a[0][1] 및 a[0][2], a[1][1] 및 a[1][2]는 0이 됩니다.
3. 포인터 배열과 2차원 배열의 차이점은 무엇입니까?
2차원 배열은 단일 메모리 블록입니다. 포인터 배열은 개별(별도로 할당된) 1차원 배열을 가리키는 포인터의 집합입니다. 이는 '조각난' 배열의 메모리를 할당할 때 중요합니다.
두 번째 크기를 명시하지 않고 2차원 배열을 선언하고 함수에 전달하려고 시도하여 컴파일 오류를 발생시키는 경우. 포인터로 대체하려는 표면적인 수정은 이후 계산에서 정의되지 않거나 잘못된 동작을 초래합니다.
장점:
단점:
개발자가 모든 차원의 크기를 명시적으로 지정하고, 메모리에서 요소를 저장하는 순서를 문서화하여 향후 유지 보수 중 오류를 줄입니다.
장점:
단점: