В качестве примера рассмотрим следующую структуру:
struct S {
int a[4];
int b[4];
} s;
Будет ли законным писать s.a[6]
и ожидать, что он будет равен s.b[2]
?
Лично я чувствую, что это должен быть UB на С++, тогда как я не уверен в C.
Тем не менее, я не смог найти что-либо релевантное в стандартах языков C и С++.
Обновление
Есть несколько ответов, предлагающих способы убедиться, что нет прокладки
между полями, чтобы обеспечить надежную работу кода. Я хотел бы подчеркнуть
что если такой код является UB, то недостаточное заполнение недостаточно. Если это UB,
то компилятор может предположить, что обращения к S.a[i]
и S.b[j]
не позволяют
перекрывается, и компилятор может свободно изменять порядок доступа к памяти. Например,
int x = s.b[2];
s.a[6] = 2;
return x;
можно преобразовать в
s.a[6] = 2;
int x = s.b[2];
return x;
который всегда возвращает 2
.