728x90

size_t란?

size_t는 부호없는 정수형(unsigned integer type)으로 표준 라이브러리에서 메모리크기나 개수를 나타내기 위해 사용하는 타입니다.

stddef.h, stdio.h, stdlib.h, string.h 등의 다양한 헤더파일에서 사용되며, 그 정의는 다음과 같습니다.

 

typedef unsigned int size_t; //시스템에 따라 다름

 

하지만 실제 정의는 컴파일러와 시스템 아키텍처에 따라 달라지며, 32bit 시스템에서는 unsigned int, 64bit 시스템에서는 unsigned long 혹은 unsigned long long 일 수 있습니다.

 

주요 사용 예시 :

  • malloc, calloc, realloc 등의 함수에서 메모리 크기를 인자로 받을 때
  • sizeof 연사자의 겨로가 타입
  • 문자열 관련 함수(strlen, memcpy, memset)에서 크기나 길이를 나타낼 때
size_t length = strlen("hello");
void* ptr = malloc(sizeof(int) * 10);

 

size_t를 사용했을 때의 장점

1. 플랫폼 독립성

  • 32bit/64bit 환경에 따라ㅏ 자동으로 적절한 크기의 타입이 설정됨
  • 크로스 플랫폼 코드를 작성할 때 유리

2. 메모리 크기 표현에 최적화

  • 메모리 크기와 관련된 연산에서는 부호가 필요 없기 때문에 unsigned로 정의된 size_t가 적절
  • 음수가 될 수 없는 값을 표현할 때 안전

3. 오버플로우 방지에 비교적 유리

  • 배열 크기나 인덱스의 최대값까지 안전하게 표현 가능(signed 보다 큰 값 표현 가능)

4. 표준 라이브러리와의 일관성

  • malloc, strlen, sizeof 등과의 타입 호환성이 맞지 않아서 경고나 오류없이 사용 가능

 

size_t의 단점 및 주의점

1. 부호가 없으므로 음수 표현 불가

  • int 처럼 -1 같은 음수를 표현할 수 없음
  • 예를들어, 오류를 -1로 반환하는 로직에는 사용할 수 없음
size_t result = -1 // 이 경우 result는 매우 큰 수가 됨

 

2. 부등호 비교시 버그 유발 가능

  • int와 혼합된 연산 또는 비교 시 예기치 않은 결과 발생 가능
iont a = -5;
size_t b = 10;
if(a < b) // 경고없이 참이지만, 논리적으로 이상할 수 있음

 

3. 디버깅 시 혼란

  • 출력할 때 %zu를 사용해야 ㅎ마ㅕ, 잘못 출력하면 값이 이상하게 보일 수 있음
printf("%zu\n", size_var); // 올바른 방법

 

4. 이식성이 있으나, 직관성은 떨어짐

  • 초보자 입장에서 unsigned int와 달리 직관적으로 이해하기 어려울 수 있음
728x90

+ Recent posts