Does the C99/C++11 standard guarantee that sizeof(size_t) == sizeof(void*)
is always true?
size_t f(void* p)
{
return (size_t)(p); // Is it
No, that is not guaranteed. Use intptr_t
or uintptr_t
to safely store a pointer in an integer.
There are/were architectures where it makes sense for that to be false, such as the segmented DOS memory model. There the memory was structured in 64k segments - an object could never be larger than a segment, so 16-bit size_t
would be enough. However, a pointer had "segment" and "offset" parts, so it would by definition have to be larger than 16 bits to be able to refer to different segments.