I believe it was never considered necessary for
the standard to actually spell out that arrays
don't have padding, for the simple reason that
there is absolutely no reason why such padding
might ever be useful on any implementation.
That said, I do believe the standard forbids
such padding, through the description of the
6.5.9 Equality operators
6 Two pointers compare equal if and only if
[...] or one is a pointer
to one past the end of one array object and the
other is a pointer to the start of a different
array object that happens to immediately follow
the first array object in the address space.
points is a pointer one past the end of the first
a pointer to the second array subobject, which
immediately follows the first array in memory.
These pointers are required to compare equal. If
int had trailing padding, if
sizeof(int) > 2 * sizeof(int),
I cannot imagine how any implementation could make
the two pointers compare as equal.