C++ 함수에서 배열 매개변수의 크기 출력하기
C++에서는 sizeof() 연산자를 사용하여 데이터 타입이나 변수의 크기를 바이트 단위로 확인할 수 있습니다. 하지만 배열을 함수의 매개변수로 전달할 때는 주의해야 할 점이 있습니다. 배열이 함수로 전달되면 실제 배열이 아니라 포인터로 자동 변환(배열 감쇠, Array Decay)되기 때문입니다.
아래 프로그램은 이러한 현상을 보여주는 대표적인 예제입니다.
예제 코드
#include <iostream>
using namespace std;
int func(int a[]) {
cout << "Size: " << sizeof(a);
return 0;
}
int main() {
int array[5];
func(array);
cout << "\nSize: " << sizeof(array);
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Size: 8
Size: 20
코드 상세 분석
1. func() 함수 내부 — 크기가 8인 이유
func() 함수 안에서 sizeof(a)의 결과는 8바이트입니다. 그 이유는 main()에서 배열을 func()에 전달할 때, 배열 전체가 복사되는 것이 아니라 배열의 시작 주소를 가리키는 포인터만 전달되기 때문입니다.
즉, int a[]라는 매개변수는 사실상 int* a와 동일하게 처리되며, sizeof(a)는 배열 전체의 크기가 아닌 포인터 하나의 크기(64비트 시스템 기준 8바이트)를 반환합니다.
int func(int a[]) {
cout << "Size: " << sizeof(a); // 포인터 크기인 8 출력
return 0;
}2. main() 함수 내부 — 크기가 20인 이유
반면 main() 함수 안에서 sizeof(array)의 결과는 20바이트입니다. 여기서 array는 실제 배열이므로, int 타입의 크기(4바이트)에 배열 요소의 개수(5개)를 곱한 값인 4 × 5 = 20바이트가 계산됩니다.
int main() {
int array[5];
func(array);
cout << "\nSize: " << sizeof(array); // 배열 전체 크기인 20 출력
return 0;
}배열의 실제 크기를 얻는 올바른 방법
함수에서 배열의 실제 크기를 알아내려면 다음과 같은 방법들을 활용할 수 있습니다.
방법 1: 참조(Reference)로 배열 전달하기
template<size_t N>
int func(int (&a)[N]) {
cout << "Size: " << N; // 5 출력
return 0;
}
방법 2: std::array 또는 std::vector 사용하기
C++11 이후에는 std::array를 사용하면 size() 멤버 함수를 통해 항상 정확한 크기를 얻을 수 있으며, 유연성이 필요하다면 std::vector를 사용하는 것이 권장됩니다.
#include <array>
int func(std::array<int, 5>& a) {
cout << "Size: " << a.size(); // 5 출력
return 0;
}
정리
- sizeof()는 데이터 타입이나 변수의 크기를 바이트 단위로 반환합니다.
- 배열을 함수에 전달하면 포인터로 변환되므로 sizeof() 결과가 포인터 크기(8바이트)가 됩니다.
- 원본 배열 위치에서는 전체 요소 크기(int 4바이트 × 5개 = 20바이트)가 반환됩니다.
- 함수에서 배열 크기를 정확히 얻으려면 템플릿 참조 전달 또는 std::array / std::vector 사용을 권장합니다.