C언어 sizeof 연산자
선수학습(3개)
요약
C언어 sizeof 연산자의 동작을 정리합니다. 포인터와 배열에 sizeof를 적용했을 때 결과가 어떻게 다른지, 배열 길이를 구하는 sizeof(arr) / sizeof(arr[0]) 패턴, 함수 인자로 전달된 배열에서 sizeof가 동작하지 않는 이유까지 설명합니다.
sizeof 핵심 정리
| 대상 | sizeof 결과 | 비고 |
|---|---|---|
포인터 (int*, char* …) | 주소의 크기 | 가리키는 대상의 크기가 아님 |
배열 (int arr[N]) | 원소 크기 × 원소 수 | 배열 전체 크기 |
| 함수 인자로 받은 배열 | 포인터의 크기 | 배열이 포인터로 변환됨 |
sizeof란?
sizeof는 자료형이나 변수가 메모리에서 차지하는 크기를 바이트 단위로 알려주는 연산자입니다. 함수처럼 보이지만 컴파일 시점1에 크기가 결정되는 연산자입니다.
정보처리기사 실기에서는 자료형별 크기(int가 몇 바이트인지)를 묻기보다, 포인터와 배열에 sizeof를 적용했을 때 결과가 다르다는 점과 배열의 길이를 구하는 패턴이 중요합니다.
포인터에 sizeof를 쓰면?
포인터에 sizeof를 적용하면 포인터가 가리키는 대상의 크기가 아니라, 주소를 저장하는 공간의 크기가 나옵니다.
| 식 | 의미 |
|---|---|
sizeof(p) | 포인터 변수 자체의 크기 (주소를 담는 공간) |
sizeof(*p) | 포인터가 가리키는 값의 크기 (역참조했을 때의 타입) |
배열에 sizeof를 쓰면?
배열 이름에 sizeof를 적용하면 배열 전체가 차지하는 바이트 수를 돌려줍니다. 포인터 크기가 아니라는 점이 핵심입니다.
배열 이름은 보통 포인터처럼 동작하지만, sizeof 안에서는 배열 본래의 크기를 그대로 알려줍니다. 이 점이 배열과 포인터의 가장 큰 차이 중 하나입니다.
배열 길이 구하기 패턴
위 두 값을 나누면 배열의 원소 개수가 나옵니다. 배열 길이를 직접 적지 않고 안전하게 구하는 관용구입니다.
| 식 | 의미 |
|---|---|
sizeof(arr) | 배열 전체 크기 |
sizeof(arr[0]) | 원소 한 개 크기 |
sizeof(arr) / sizeof(arr[0]) | 원소 개수 (= 배열 길이) |
원소의 자료형이 int든 double이든 구조체든 상관없이 동일한 패턴으로 길이를 구할 수 있습니다.
함수 인자로 전달된 배열은 다릅니다
함수 매개변수로 적힌 배열은 호출 시 포인터로 변환됩니다. 그래서 함수 안에서 sizeof를 쓰면 배열 전체가 아니라 포인터 크기가 나옵니다.
같은 sizeof(arr)인데도 위치(main 안 vs 함수 안)에 따라 결과가 달라집니다. 함수에 배열을 넘긴 시점에서 원래 배열의 길이 정보가 사라지기 때문입니다.
정처기 실기 대비 실전 문제
Footnotes
-
컴파일 시점이란 코드를 기계어로 번역하는 단계를 말합니다. 프로그램이 실행되기 전에 sizeof 값이 이미 정해진다는 뜻입니다. ↩