37.3 2차원 배열의 요소에 값 할당하기

이번에는 배열을 선언할 때 값을 초기화하지 않고, 배열의 요소에 각각 할당해보겠습니다.

  • 배열[세로인덱스][가로인덱스] = 값;

two_dimensional_array_assign.c

#include <stdio.h>

int main()
{
    int numArr[3][4];

    numArr[0][0] = 11;    // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당
    numArr[0][1] = 22;    // 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
    numArr[0][2] = 33;    // 세로 인덱스 0, 가로 인덱스 2인 요소에 값 할당
    numArr[0][3] = 44;    // 세로 인덱스 0, 가로 인덱스 3인 요소에 값 할당

    numArr[1][0] = 55;    // 세로 인덱스 1, 가로 인덱스 0인 요소에 값 할당
    numArr[1][1] = 66;    // 세로 인덱스 1, 가로 인덱스 1인 요소에 값 할당
    numArr[1][2] = 77;    // 세로 인덱스 1, 가로 인덱스 2인 요소에 값 할당
    numArr[1][3] = 88;    // 세로 인덱스 1, 가로 인덱스 3인 요소에 값 할당

    numArr[2][0] = 99;    // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당
    numArr[2][1] = 110;   // 세로 인덱스 2, 가로 인덱스 1인 요소에 값 할당
    numArr[2][2] = 121;   // 세로 인덱스 2, 가로 인덱스 2인 요소에 값 할당
    numArr[2][3] = 132;   // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당

    printf("%d\n", numArr[0][0]);    // 11 : 세로 인덱스 0, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[1][2]);    // 77 : 세로 인덱스 1, 가로 인덱스 2인 요소 출력
    printf("%d\n", numArr[2][0]);    // 99 : 세로 인덱스 2, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[2][3]);    // 132: 세로 인덱스 2, 가로 인덱스 3인 요소 출력

    return 0;
}

실행 결과

11
77
99
132

2차원 배열의 요소를 출력할 때와 마찬가지로 [ ]에 인덱스를 지정한 뒤 값을 할당하면 됩니다.

2차원 배열에서 범위를 벗어난 인덱스에 접근하면 어떻게 될까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

two_dimensional_array_invalid_index.c

#include <stdio.h>

int main()
{
    int numArr[3][4];

    numArr[0][0] = 11;    // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당
    numArr[0][1] = 22;    // 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
    numArr[0][2] = 33;    // 세로 인덱스 0, 가로 인덱스 2인 요소에 값 할당
    numArr[0][3] = 44;    // 세로 인덱스 0, 가로 인덱스 3인 요소에 값 할당

    numArr[1][0] = 55;    // 세로 인덱스 1, 가로 인덱스 0인 요소에 값 할당
    numArr[1][1] = 66;    // 세로 인덱스 1, 가로 인덱스 1인 요소에 값 할당
    numArr[1][2] = 77;    // 세로 인덱스 1, 가로 인덱스 2인 요소에 값 할당
    numArr[1][3] = 88;    // 세로 인덱스 1, 가로 인덱스 3인 요소에 값 할당

    numArr[2][0] = 99;    // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당
    numArr[2][1] = 110;   // 세로 인덱스 2, 가로 인덱스 1인 요소에 값 할당
    numArr[2][2] = 121;   // 세로 인덱스 2, 가로 인덱스 2인 요소에 값 할당
    numArr[2][3] = 132;   // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당

    printf("%d\n", numArr[-1][-1]);   // 음수이므로 잘못된 인덱스
    printf("%d\n", numArr[0][4]);     // 가로 인덱스가 배열의 범위를 벗어남
    printf("%d\n", numArr[4][0]);     // 세로 인덱스가 배열의 범위를 벗어남
    printf("%d\n", numArr[5][5]);     // 세로, 가로 인덱스 모두 배열의 범위를 벗어남

    return 0;
}

실행 결과

-858993460 (쓰레기 값)
55         (원하지 않는 요소 [1][0]에 접근)
4687800    (쓰레기 값)
2359296    (쓰레기 값)

2차원 배열의 요소에 접근할 때 인덱스로 음수를 지정하거나, 배열의 크기를 벗어난 인덱스를 지정해도 컴파일 에러가 발생하지 않습니다. 하지만 실행을 해보면 쓰레기값이 출력됩니다. 즉, 배열의 범위를 벗어난 인덱스에 접근하면 배열이 아닌 다른 메모리 공간에 접근하게 됩니다

특히 2차원 배열은 값이 일렬로 쭉 늘어서 있으므로 numArr[0][4]와 같이 가로 인덱스가 범위를 벗어나도록 지정하면 그다음 세로 인덱스 요소인 numArr[1][0]에 접근하게 됩니다.