Size_t '에서' i am getting 혼동하는 것은 '뒤에' 반환되었습니다 C. 그러니까말이야 스이제로프 연산자를. 하지만 정확히 어떻게 셜록이야? 이것은 데이터 형식?
for(i = 0; i < some_size; i++)
Size_t 사용해야 하는 'int' 또는 '' i, i,?
>. 1999년 '에 따르면 ISO C 표준 >. Size_t ',' 는 서명되지 않은 정수 (C99) >. 최소한 16 비트 (http://otl. 단면에는 유형 >. 7.17 및 7.18.3). >. >. size_t '' 는 서명되지 않은 데이터 유형 >. c/c++ 표준을 의해 정의된 여러 >. iso / IEC 9899 표준 C99 예: >. 1 스트라이프할 수 있는 '스타디f.흐 정의되어 있는'. >. 임포트된 포함인지 의해 높일 수 있을 것이다 >. 스테드리발트 서브노드 내부적으로 '으로' 이 파일을 >. '에는' 스타디f.흐. >. >. 이 유형은 나타내는 데 사용되는 >. 객체의 크기를. 라이브러리 함수 >. 또는 그 크기가 걸리는 복귀하십시오 작성되지는 >. 반환 유형 또는 유형의 수 있다. >. size_t '의'. 또한 대부분의 >. 자주 사용되는 컴파일러 기반의 >. 스이제로프 연산자를 평가해야 할 수 있는 >. 상수 값을 호환됩니까 >. size_t ''.
Size_t 표시됨과 '의미' 는 유형, 모든 것을 가질 수 있도록 어레이입니다 색인입니다.
size_t '' 는 서명되지 않은 유형:. 따라서 모든 음의 값을 표현할 수 없습니다 (<, 0). 이 때 사용하는 계산 할 수 없다는 것을 확인할 수 있으며, 부정적인 반응을 보였다. 예를 들어, '스트린 ()' 때문에 'a' size_t 되돌려줍니다 디스테이징하는 문자열으로 0 이상 되어야 합니다.
예를 들어, 이 경우 항상 0 보다 크면 루프 인덱스화할 것입니다 'size_t', 또는 기타 부호 없는 데이터 형식을 사용할 수 있는 것이 좋을 수도 있습니다.
Size_t 사용할 때 ',' 객체에는 해야 하는 등 이 모든 컨텍스트로 산술, 음이 아닌 값을 운영까지도 사용됩니다. 예를 들어, let& # 39 에 있다고 가정합니다.
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
길이는 str2 '와' 및 '의 차이를 찾으려는 str1'. 할 수 없습니다.
int diff = s2 - s1; /* bad */
이 때문에 '는 대입된 값이 항상 경우에도' s2 < 양수, diff '될 것입니다. 계산을 처리할 수 있기 때문에 s1 'unsigned 유형. 이 경우, 어떤 비유하사 따라 사용할 수 있습니다 'int' (또는 '긴 긴') 를 사용하는 것이 좋습니다 '와' 's1 s2'.
몇 가지 기능을 사용할 수 있는 '하지만' / / POSIX C # 39, 역사적 이유 때문에 size_t don& 없다. 예를 들어, 두 번째 매개 변수 int '이지만' ',' '' size_t 프리츠 두는 것이 좋습니다.
size_t '는 유형' 보유할 수 있는 모든 어레이입니다 색인입니다.
구축에 따라, 이 중 하나가 될 수 있습니다.
부호 없는 챨 ''
'unsigned short'
'unsigned int'
긴 'unsigned'
긴 긴 'unsigned'
typedef unsigned long size_t;
이 경우 경험적 유형: ,
echo | gcc -E -xc -include 'stddef.h' - | grep size_t
우분투 14.04 대한 출력입니다 64-비트 mgcc 4.8:
typedef long unsigned int size_t;
참고로, '' 가 아니라 '에서' 에서 제공하는 glibc 스타디f.흐 mgcc src/gcc/ginclude/stddef.h mgcc 4.2.
size_t malloc '는' - '때문에' 인수로 할당할지 수 있는 최대 크기를 결정합니다.
또한 ',' 스이제로프 반환된 이후 최대 크기를 생각하면 제한값 모든 어레이입니다.
참고: https://stackoverflow.com/questions/9386979/the-maximum-size-of-an-array-in-c
아직 아무도 언급한 이후 정보기술 (it), '주' 언어 '의 값을 반환하는 것은' 스이제로프 연산자를 size_t 정확하게 파악하고 있는 유형:. 마찬가지로, '주' 가 출력 값을 뺀 한 것은 다른 의미를 ptrdiff_t 포인터입니다 iqn 유형:. 이 같은 기능을 사용할 수 있게 받아들일 수 있는 승인하십시오 라이브러리 함수 객체 그 크기 때문에 시스템의 코드 없이 치열한 경쟁을 벌이고 있는 UINT_MAX 초과함을 객체에는 강요하는 등 보다 큰 값을 반군지역 존재할 수 있습니다, 쓰레기 " 서명되지 않은 int". 여기서 더 큰 유형 시스템의 모든 가능한 객체에는 충분할 것이다.
size_t '' 와 'int' 함께 사용할 수 없습니다. 예를 들어 '는' 의 64 비트 리눅스 64-비트 size_t size 에 (즉, '스이제로프 (void *)') 이지만 int 가 32 비트 ''.
또한 'size_t' 는 서명되지 않은. 다음 버전 '일부' 를 하는 경우 서명됩니다 좁히어 가 ssize_t 플랫폼 및 it 관련 데이터베이스에구성원을 예제에서와 높아질 것입니다.
일반적으로 사용하는 대부분의 일반 건, '꼭 이래야겠어요 제안하세요 int' 만을 사용할 경우 '/' 'size_t ssize_t' 특정 필요한 시점에 (mmap () '와' 예).
Size_t '왜' 여기 온 어떻게 존재할 수 있으며 필요한 들어갈 예정이다.
Size_t 보장받을 수 있는 실용적인 약관보다 ptrdiff_t '이' 와 ',' 에 대한 폭 넓은 64 비트, 32 비트 및 32 비트, 64 비트 구현을 구축현 드릴링됩니다. 그들은 매년 컴파일러와의 끊기지 않고 기존 유형에 인력용 없습니다 한다는 것을 의미하는 것으로, 기존의 코드.
Size_t ptrdiff_t '또는' a '' 아니다 '' 또는 '같은 표시됨과 intptr_t uintptr_t'. 그들은 여전히 사용되고 있던 다른 일부 아케텍처에 size_t ptrdiff_t '와' 때 '표준' 80 년대 후반 때 추가된 '가 아니라 여러 가지 새로운 유형, 그리고 비활용 C99 추가되든지 아직이라구요 (16 비트 Windows 같은) 다. 16 비트 보호 모드 x86 메모리 세그먼트 (segmented 어레이나 구조를 가지고 있는 수 있지만, 65,536 바이트 가능한 가장 큰 규모의 '만' 보다 훨씬 넓고 넓은 포인터입니다 필요하다고 32 비트 레지스터. 이러한 ',' intptr_t 넓지만 '수' 와 'ptrdiff_t size_t 없었더라면 32 비트 및 16 비트 레지스터' 등 다양한 부문에 적합합니까. 아는 어떤 종류의 운영 체제 및 향후 쓸 수 있습니다. 이론상 48 비트 i386 아키텍처 제공사항 32 비트 운영 체제를 실제로 사용된 적이 없는 포인터 세그먼트화 모델.
너무 긴 '유형' 때문에 메모리 오프셋된 수 없습니다 '긴' 는 기존 코드를 이들보 가정합니다 정확히요 32 비트 이다. 그는 이러한 가정에 내장되었을 UNIX 및 윈도 api 는. 또 다른 것으로 추정된다 'a' 는 기존 코드를 죄송합니다. 많이유 개최할 수 있을 정도로 매우 긴 파일 포인터를 오프셋된 초를 경과된 1970년, 드릴링됩니다. POSIX 는 표준화된 방법을 rmw 추정이 사실이라면 전 있지만 대신 강제 괜찼습니다 는 이동형이든지 가정 할 수 있습니다.
이 때문에 몇몇 컴파일러에도 int '만' 작은 수 없습니다 '에서' 90 년대 브라운아저씨의 int '64 비트 이다. 그들은 정말 이상한 잡을라는데 유지하면 '긴' 32 비트 이다. 다음 버전에 비해 더 긴 '수' 를 선언한 '표준' 불법 'int, int 가 32 비트 와이드' 있지만 여전히 대부분의 64 비트 시스템.
Long long int '이 있는데, 어쨌든, 이후 수 없습니다.' 는 나중에 추가할 수 있는 최소 64 비트 와이드 창조되었으되 대해서도 32 비트 시스템.
그래서 새로운 방식의 했습니다. 아니었는데, 그 이외의 다른 유형의 경우에도 오프셋할 어레이나 객체에는 내의 모든 것을 의미했다. And if there was one of 32 64 비트 교훈을 얻은 파동 마이그레이션까지 전송되었기 고유해야 의심하였더라 속성 유형, 그리고 다른 뜻을 갖는 데 필요한 방정식입니다 사용하지 않는 것을 다른 프로그램.
일반적으로 0 부터 시작하는 경우, 항상 flfile. 서명되지 않은 유형을) 와 어쩔 것인가 등의 음수 값을 너회가 붙여넣습니다 오버플로입니다 설치하는 것이다. 이 경우 발생할 수 있기 때문에 매우 중요합니다 니며 어레이입니다 보다 클 수 있지만, 최대 너회의 루프 (loop) 최대 변화가 발생합니까 너회의 최대 사용자 유형에 줄 바꿈될 됩니다 세그먼트화 잘못이요 (시그제고프) 경험하십시오 제외어 수도 있습니다. 따라서 일반적으로 0 부터 시작하여 위쪽 int 의 루프 전혀 사용하지 않는 것입니다. 사용하는 서명되지 않은.
, 객체에는 size_t 사용할 때 우리는 이 모든 것을 확인할 수 있도록 우리는 우리가 원하는 모든 음이 아닌 값을 디렉토리에만 컨텍스트로 등 사용됩니다. 예를 들어, 다음과 같은 프로그램을 말해둘꼐요 예기치 않은 결과를 줄 것이다.
// C program to demonstrate that size_t or
// any unsigned int type should be used
// carefully when used in a loop
#include<stdio.h>
int main()
{
const size_t N = 10;
int a[N];
// This is fine
for (size_t n = 0; n < N; ++n)
a[n] = n;
// But reverse cycles are tricky for unsigned
// types as can lead to infinite loop
for (size_t n = N-1; n >= 0; --n)
printf("%d ", a[n]);
}
Output
Infinite loop and then segmentation fault