Скажем, у меня есть такой код
struct A {
int header;
unsigned char payload[1];
};
A* a = reinterpret_cast<A*>(new unsigned char[sizeof(A)+100]);
a->payload[50] = 42;
Это неопределенное поведение? Создание указателя, указывающего за пределы payload
, должно быть неопределенным, AFAIK, но я не уверен, верно ли это и в случае, когда я выделил память после массива.
Стандарт говорит, что p[n]
совпадает с *(p+ n)
и "если выражение P указывает на i-й элемент объекта массива, выражения (P)+N указывают на i+n-е элементы массива". В примере payload
указывает на элемент в массиве, выделенный с помощью new, так что это может быть нормально.
Если возможно, было бы неплохо, если бы ваши ответы содержали ссылки на стандарт C++.
unsigned char
? Есть лиsigned char
? - person Khalil Khalaf   schedule 01.07.2016char
обычно (но не всегда) является знаковым символом, и естьsigned char
, который всегда подписан. - person alain   schedule 01.07.2016A
является POD, но есть гораздо более приятные способы справиться с этим. - person Richard Hodges   schedule 01.07.2016static_cast
здесь. Кроме того, чтобы получить четко определенное поведение, вам может понадобиться использовать новое размещение для создания фактического объекта, я не уверен. Лучше задайте вопрос, как это сделать правильно! - person   schedule 01.07.2016reinterpret_cast
имеет очень мало применений, которые не являются UB или в лучшем случае реализацией -определены, и это явно не один из них. И гибкие члены массива не являются частью C++, поэтому я не знаю, почему вы их упоминаете. - person underscore_d   schedule 03.07.2016char
- это отдельный тип, который не обязательно должен быть эквивалентен ниsigned char
, ниunsigned char
, независимо от того, может ли он быть в практических реализациях. (наверное, академическое отличие, но оно описывает многие вещи на этом языке, которые все же стоит знать) - person underscore_d   schedule 03.07.2016char
будет отражать доступные значения одного из двух квалифицированных типов, в зависимости от реализации, но эти три отличаются тем, что они получают разныеtypeid
и т. д. Просто хотел добавить этот нюанс. - person underscore_d   schedule 03.07.2016int
/signed int
, которые одинаковы. Спасибо! - person alain   schedule 03.07.2016new
как на распределитель для объектов массива, аpayload
затухает на указатель. С актерским составом все в порядке... или? - person Jean-Baptiste Yunès   schedule 04.07.2016