On my system both
size_t are 64-bit.
I would like to clarify two things:
I believe that no array could be as large as
size_tdue to address space restrictions. Is this true?
If yes, then, is there a guarantee that
ptrdiff_twill be able to hold the result of subtraction of any pointers within the max-sized array?
Most implementations artificially restrict the maximum array size to make sure that difference between two pointers pointing into the same array fits into
ptrdiff_t. So, it is more than likely that on your platform the maximum allowed array size is about
SIZE_MAX / 2 (try it). This is not an "address space restriction", it is just a restriction internally enforced by your implementation. Under this restriction, legal pointer subtraction ("legal" = two pointers into the same array) will not overflow.
The language specification does not require that though. Implementations are not required to restrict their array size in that way, meaning that language specification allows seemingly legal pointer subtractions to overflow and produce undefined behavior. But most implementations prefer to defend against this by restricting their array sizes.
See the "three options" here for more details: Why is the maximum size of an array "too large"?