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 값이 이미 정해진다는 뜻입니다. ↩