36.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개 // sizeof(numArr) / sizeof(numArr[0]) 형태도 가능
참고 | 배열의 크기와 인덱스
C 언어는 인덱스가 배열의 범위를 벗어났는지 검사하지 않으므로 프로그래머가 항상 이 부분을 생각하면서 작성해야 합니다. 배열의 크기(요소 개수)를 구해놓고, 배열에 접근하기 전에 인덱스가 요소 개수 - 1을 넘지 않는지 확인하는 것도 좋은 방법입니다.
int numArr[10]; // 요소가 10개인 배열 int index = 10; // 배열의 범위를 벗어나는 인덱스 int count = sizeof(numArr) / sizeof(int); // 배열의 크기(요소의 개수)를 구함 if (index <= count - 1) // 인덱스가 count - 1보다 작거나 같으면 배열의 범위를 벗어나지 않았음 { numArr[index] = 999; }