In this blog entry by Andrey Karpov entitled, "About size_t and ptrdiff_t" he shows an example,
for (ptrdiff_t i = 0; i < n; i++)
a[i] = 0;
However, I'm not sure if that's right, it seems that should be
for (size_t i = 0; i < n; i++)
a[i] = 0;
Is this correct?
I know we should also likely be using something like memset, but let's avoid that entirely. I'm only asking about the type
In a blog post, I argue that you should always refrain from allocating memory blocks larger than
PTRDIFF_MAX(*), because doing so will make compilers such as Clang and GCC generate nonsensical code even if you do not subtract pointers to that block in a way that causes the result to overflow.(*) Even if
mallocsucceeds when you pass it a value larger thanPTRDIFF_MAX. The crux of the problem is that GCC and Clang only generate code that behaves correctly when linked with such amalloc, but Glibc provides amallocfunction that does not implement this limitation.If you follow that constraint (which I encourage you to: that's the message of the blog post), then both types are equally correct.
This said, since only positive offsets need to be represented,
size_twould be the natural choice in your example.