size_t must be large enough to contain the size of the largest possible object. uintptr_t must be large enough to contain any pointer. Given this, it is more or less guaranteed that sizeof(uintptr_t) >= sizeof(size_t) (since all bytes in the maximum possible object must be addressable), but no more. On machines with linear addressing, they are likely to be the same size. On segmented architectures, on the other hand, this is usually uintptr_t larger than size_t , since the object must be in the same segment, but the pointer must be able to address all the memory.
source share