답변:
에서 친절한 위키 백과 :
stdlib.h 및 stddef.h 헤더 파일 은 객체의 크기를 나타내는 데 사용되는 size_t 라는 데이터 유형을 정의 합니다. 크기를 취하는 라이브러리 함수는 크기가 size_t 인 것으로 예상하고 sizeof 연산자는 size_t로 평가됩니다.
size_t의 실제 유형은 플랫폼에 따라 다릅니다. 일반적인 실수는 size_t가 부호없는 int와 같다고 가정하는 것인데, 이는 특히 64 비트 아키텍처가 널리 보급됨에 따라 프로그래밍 오류로 이어질 수 있습니다.
또한 size_t가 중요한 이유를 확인하십시오.
/usr/include/stdlib.h
는 정의를 가져오고 다른 헤더 파일에서 달리 언급하지 않는 한 /usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h
기본값으로 설정 long unsigned int
됩니다.
size_t는 크기를 나타내는 데 사용되는 유형입니다 (이름에서 알 수 있듯이). 플랫폼 (및 잠재적으로 구현 가능)에 따라 달라지며이 목적으로 만 사용해야합니다. 분명히, 크기를 나타내는 size_t는 부호가 없습니다. malloc, sizeof 및 다양한 문자열 연산 함수를 포함한 많은 stdlib 함수는 size_t를 데이터 유형으로 사용합니다.
int는 기본적으로 서명되며 크기도 플랫폼에 따라 다르지만 대부분의 최신 컴퓨터에서 고정 된 32 비트가됩니다 (64_s 아키텍처에서는 size_t가 64 비트이지만 int는 32 비트로 유지됩니다).
요약 : size_t를 사용하여 객체의 크기를 나타내고 다른 경우에는 int (또는 long)를 나타냅니다.
size_t
유형의 부호없는 정수 형태로 정의 sizeof
연산자. 실제로는 64 비트 플랫폼에서 int
32 비트 (역 호환성을 위해)로 size_t
정의되었지만 64 비트 (4 GiB보다 큰 배열 및 구조를 선언 할 수 있음 )로 정의되는 경우가 종종 있습니다. a long int
가 64 비트 인 경우이를 LP64 규칙이라고합니다. 경우에는 long int
32 비트로되지만, long long int
및 포인터를 LLP64의 64 비트이다. 속도를 위해 64 비트 명령어를 사용하지만 메모리를 절약하기 위해 32 비트 포인터를 사용하는 프로그램 인 리버스도 얻을 수 있습니다. 또한 int
서명되고 size_t
서명되지 않습니다.
역사적으로 주소가의 기본 크기보다 넓거나 짧은 다른 플랫폼도있었습니다 int
. 실제로, 70 년대와 80 년대 초에는 이것이 일반적이지 않았습니다. 모든 인기있는 8 비트 마이크로 컴퓨터는 8 비트 레지스터와 16 비트 주소를 가졌으며 16 비트와 32 비트 사이의 전환은 많은 기계를 생산했습니다. 자신의 레지스터보다 주소가 더 넓습니다. MS-DOS 용 Borland Turbo C에 대한 질문은 여전히 그렇습니다. 거대한 메모리 모드에는 16 비트 CPU에서 32 비트로 저장된 20 비트 주소가 있지만 80386의 32 비트 명령어 세트를 지원할 수 있습니다. Motorola 68000에는 32 비트 레지스터와 주소가있는 16 비트 ALU가 있습니다. 15 비트, 24 비트 또는 31 비트 주소를 가진 IBM 메인 프레임이있었습니다. 또한 임베디드 시스템에서 다른 ALU 및 주소 버스 크기를 볼 수 있습니다.
시간 int
이보다 작고 size_t
에 매우 큰 파일 또는 객체의 크기 또는 오프셋을 저장하려고하면 unsigned int
오버플로가 발생하여 버그가 발생할 수 있습니다. 를 사용하면 int
음수를 얻을 가능성도 있습니다. 는 IF int
또는 unsigned int
넓은 프로그램이 제대로 실행되지만 메모리를 낭비 할 것이다.
이식성을 원하는 경우 일반적으로 목적에 맞는 올바른 유형을 사용해야합니다. 많은 사람들이 부호없는 수학 대신 부호없는 수학을 사용하도록 권장합니다 (불쾌하고 미묘한 버그를 피하기 위해 1U < -3
). 그 목적을 위해, 표준 라이브러리를 정의 ptrdiff_t
에서 <stddef.h>
서로에 대한 포인터를 뺀 결과의 서명 유형으로.
즉에 대한 모든 주소와 오프셋을 경계 체크에 해결 될 수 말했다 INT_MAX
및 하나 0
또는 INT_MIN
적절하게, 그리고 당신이 하나를 놓칠 경우 컴파일러 서명을 비교에 대한 경고 및 서명되지 않은 수량을 켭니다. 어쨌든 항상 C에서 오버플로에 대한 배열 액세스를 항상 확인해야합니다.
size_t는 int (구조 일 수도 있음) 이외의 것이 될 수 있기 때문입니다. 아이디어는 기본 유형에서 작업을 분리한다는 것입니다.
size_t
부호없는 정수 유형 으로 지정됩니다 . C11 §6.5.3.4 5 "두 연산자 ( sizeof
_Alignof
) 의 결과 값 은 구현에 따라 정의되며 해당 유형 (부호없는 정수 유형)은입니다 size_t
."
의 정의는 SIZE_T
:에서 발견
https://msdn.microsoft.com/en-us/library/cc441980.aspx 및 https://msdn.microsoft.com/en-us/library/cc230394.aspx
필요한 정보를 여기에 붙여 넣기 :
SIZE_T
A는 ULONG_PTR
포인터가 가리킬 수있는 최대 바이트 수를 나타내는이.
이 유형은 다음과 같이 선언됩니다.
typedef ULONG_PTR SIZE_T;
A ULONG_PTR
는 포인터 정밀도에 사용되는 부호없는 long 유형입니다. 포인터 산술을 수행하기 위해 포인터를 긴 유형으로 캐스트 할 때 사용됩니다.
이 유형은 다음과 같이 선언됩니다.
typedef unsigned __int3264 ULONG_PTR;
SIZE_T
size_t
, OP가 요청한 내용 이 아닙니다 .
SIZE_T
와는 완전히 다릅니다 size_t
. 유형의 변수를 선언 할 수 없습니다 SIZE_T
.