초기화를 하는 이유
C에선 배열이 스택에 잡힌다. 스택에 잡히는 변수는 실행 전인 컴파일 시점에서 알아야 하기 때문에, 실행 중 입력 받아 크기를 잡을 수 없다. 따라서 배열의 크기는 반드시 상수로 선언되어야 한다.
초기화 방법
1차원 배열의 초기화는 너무 간단하므로 생략한다.
2차원 배열을 함수 내에서 선언하면 자동변수와 같이 쓰레기값이 초기화된다.
그러므로 배열의 기억공간을 누적변수로 사용하거나 특정 값을 저장할 필요가 있을 때는
선언과 동시에 초기화할 필요가 있다.
2차원 배열을 초기화 하는 방법은 1차원 배열을 초기화 하는 방식과 같다.
전체 기억공간의 개수만큼 중괄호 안에 초기값을 나열하면 된다.
int num[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // 이 때 초기값은 행 단위로 저장.
1 2 3 4
5 6 7 8
9 10 11 12
초기화 값을 논리적 구조에 맞게 행으로 구분하고자 한다면 중괄호를 한번 더 사용 하면 된다
int num[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int num[3][4] = {{1}, {5, 6}, {9, 10, 11}};
1 0 0 0
5 6 0 0
9 10 11 0
기억공간의 수보다 초기화 값이 적은 경우에는 남는 기억공간은 모두 0으로 초기화 된다.
결국 모든 기억공간을 0으로 초기화할 때는 첫 번째 기억공간만 으로 0초기화 하면 된다.
int mat[4][4] = {0}; // 배열의 모든 요소를 0으로 초기화 (남는 공간은 무조건 0으로 초기화)
2차원 배열은 행 첨자 하나가 생략이 가능하다
첨자가 생략되면 컴파일러는 초기값에 따라 적절한 기억공간을 할당한다.
이때 행 초기화 괄호를 사용하면 행 괄호의 개수에 따라 행의 수가 결정되며,
행 초기화 괄호가 없으면 열 첨자의수에 맞게 초기값을 끊어서 행의 수를 결정 (열 첨자 생략 불가능)
int nums[생략 가능][생략 불가능];
행 초기화 괄호를 사용하지 않은 경우
int num[][4] = {1, 2, 3, 4, 5, 6};
1 2 3 4
5 6 0 0 // 2행 4열의 기억공간 할당