From C23 §6.7.2.1(20):
[…] when a
.
(or->
) operator has a left operand that is a (pointer to) a structure with a flexible array member and the right operand namees that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array.
I am not sure I understand the last sentence. Why would the offset of the replacement array differ from that of the flexible array member (FAM)? If the replacement array has the same element type as that of the FAM, then wouldn’t it have the same alignment as the FAM and, therefore, the same offset as the FAM?