Note to future me: I checked the C++98 standard. a[i] is defined as *(a+i), the size of the array is not mentioned. So if a points somewhere where a+i is a legal access, this should be fine.
Edit: But casting the allocated memory around to a struct type might violate aliasing rules...