C 표준 size_t
은 모든 배열 색인을 보유 할 수있는 유형임을 보증합니다 . 즉, 논리적으로 size_t
모든 포인터 유형을 보유 할 수 있어야합니다. Google에서 찾은 일부 사이트에서 이것이 합법적이며 항상 작동해야한다는 것을 읽었습니다.
void *v = malloc(10);
size_t s = (size_t) v;
따라서 C99에서 표준은 intptr_t
및 uintptr_t
유형을 도입했으며 서명 된 유형과 서명되지 않은 유형은 포인터를 보유 할 수 있습니다.
uintptr_t p = (size_t) v;
사용 size_t
과 의 차이점은 무엇 uintptr_t
입니까? 둘 다 부호가 없으며 둘 다 포인터 유형을 보유 할 수 있어야 기능적으로 동일하게 보입니다. 선명도 가 아닌을 사용하는 것보다 uintptr_t
더 강력한 이유가 있습니까? 내부 기능으로 만 필드를 처리하는 불투명 한 구조에서이를 수행하지 않을 이유가 있습니까?void *
size_t
같은 토큰으로, ptrdiff_t
포인터 차이를 보유 할 수있는 부호있는 유형이므로 대부분의 포인터를 보유 할 수 있습니다. 그래서 어떻게 구별 intptr_t
됩니까?
이 모든 유형이 기본적으로 동일한 기능의 사소한 다른 버전을 제공하지는 않습니까? 그렇지 않다면 왜? 다른 것으로는 할 수없는 것 중 하나로 무엇을 할 수 없습니까? 그렇다면 왜 C99가 본질적으로 불필요한 두 가지 유형을 언어에 추가 했습니까?
함수 포인터는 현재 문제에 적용되지 않기 때문에 기꺼이 무시하고 싶지만 몰래 의심을 가짐에 따라 함수 포인터는 "올바른"답변의 중심이 될 것입니다.
size_t
하고uintptr_t
있지만 무엇인지ptrdiff_t
와intptr_t
-이 두 거의 모든 플랫폼에서 동일한 값 범위를 저장 할 수 없을 것이다? 특히 부호있는 포인터 크기의 정수 유형ptrdiff_t
의 목적을 제공하는 경우 부호있는 및 부호없는 포인터 크기의 정수 유형을 모두 갖는 이유는 무엇입니까?