Вдохновлен этим вопросом: Как * (& arr + 1) - arr дает длину в элементах массива arr?
Следующий код вычислит длину массива, хотя и вызывает неопределенное поведение:
int arr[] = {5, 8, 1, 3, 6};
size_t len = *(&arr + 1) - &arr[0]; // len is 5
Я считаю, что разыменовывая (& arr + 1), мы запускаем неопределенное поведение. Однако единственная причина, по которой мы это делаем, состоит в том, чтобы немедленно преобразовать результат в int*
, указывая на один элемент после последнего в исходном массиве. Поскольку мы не разыменовываем этот указатель, мы находимся в определенной зоне.
Вопрос, таким образом, следующий: есть ли способ разложить в int*
, не разыменовывая указатель, не содержащий ссылки, и оставаясь определенным?
PS Обязательный отказ от ответственности: да, я могу рассчитать размер массива с помощью оператора sizeof
и деления. Это не суть вопроса.
РЕДАКТИРОВАТЬ: Теперь я менее уверен, что само косвенное указание не определено. Я обнаружил http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 и, судя по всему, была попытка легализовать косвенное обращение как таковое, но я не смог найти никакой формулировки на этот счет в действующем стандарте.