33.4 배열의 크기 구하기

반복문으로 크기가 10인 배열의 요소를 모두 출력한다면 다음과 같이 만들 수 있겠죠?

int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 요소가 10개

for (int i = 0; i < 10; i++)     // 0부터 10까지 반복
{
    // 요소에 접근
}

코드를 다 작성했는데 배열의 크기를 15개로 늘려야 하는 상황이 발생했습니다. 그래서 배열의 크기를 15로 늘렸지만 실수로 반복문의 조건식은 수정하지 못했습니다.

// 배열의 크기를 15로 늘림
int numArr[15] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165 };

for (int i = 0; i < 10; i++)    // 실수로 조건식은 수정하지 못했음
{
    // 요소에 접근
}

버그는 이런 과정으로 발생하게 됩니다. 여기서는 수정할 부분이 두 곳이지만 반복문이 여러 개로 늘어나면 실수할 가능성은 그만큼 높아집니다. 실수를 방지하기 위해서는 배열의 크기가 바뀌었을 때 배열의 크기를 알아서 계산하도록 만들면 됩니다.

이미 선언된 배열의 크기(요소 개수)를 구하려면 어떻게 해야 할까요? 배열이 차지하는 전체 공간과 요소의 개수는 sizeof 연산자를 활용하면 간단하게 구할 수 있습니다.

array_size.c

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    printf("%d\n", sizeof(numArr));                  // 40: 4바이트 크기의 요소가 10개이므로 40
    printf("%d\n", sizeof(numArr) / sizeof(int));    // 10: 배열의 크기를 구할 때는
                                                     // 전체 공간을 요소의 크기로 나눠줌

    return 0;
}

실행 결과

40
10

배열에 sizeof 연산자를 사용해보면 배열이 차지하는 전체 공간이 출력됩니다. 따라서 int numArr[10];은 크기가 4바이트인 int형 요소가 10개 모여있으므로 40이 출력됩니다.

sizeof(numArr);    // 40

배열의 크기(요소 개수)를 구할 때는 배열이 차지하는 전체 공간에서 요소의 크기로 나눠줍니다.

sizeof(numArr) / sizeof(int);    // 40 / 4는 10, 요소의 개수는 10개
참고 | 배열의 크기와 인덱스

C 언어는 인덱스가 배열의 범위를 벗어났는지 검사하지 않으므로 프로그래머가 항상 이 부분을 생각하면서 작성해야 합니다. 배열의 크기(요소 개수)를 구해놓고, 배열에 접근하기 전에 인덱스가 요소 개수 - 1을 넘지 않는지 확인하는 것도 좋은 방법입니다.

int numArr[10];    // 요소가 10개인 배열
int index = 10;    // 배열의 범위를 벗어나는 인덱스
int count = sizeof(numArr) / sizeof(int);    // 배열의 크기(요소의 개수)를 구함

if (index <= count - 1)    // 인덱스가 count - 1보다 작거나 같으면 배열의 범위를 벗어나지 않았음
{
    numArr[index] = 999;
}