Является ли законным доступ к двумерному массиву, как если бы он был одномерным?

Возможный дубликат:
Можно ли рассматривать 2D-массив как непрерывный массив 1D?

Рассмотрим следующий код:

int array2d[10][10];
int *array1d = array2d[0];

Я никогда не слышал о реализации там, где это не сработало, но является ли законным доступ и управление array2d через array1d? Какой из разделов стандарта позволяет это? Есть ли что-нибудь в стандарте, предотвращающее реализацию добавлением дополнительного пространства или дополнения между каждым из массивов второго уровня (не тем, что необходимо, но все же)?

Бонусный вопрос: есть ли способ доступа к array2d как int[100], для которого не требуется reinterpret_cast или C-стиль?

Ответы

Ответ 1

Если память обслуживается, стандарт дает это как пример того, что официально undefined поведение, но по существу всегда работает. [Edit: Вот что я думал: C99, §J.2 (Undefined поведение):

  • Индекс массива выходит за допустимые пределы, даже если объект, по-видимому, доступен с помощью (как в выражении lvalue a [1] [7], учитывая объявление int а [4] [5])

Я не совсем уверен, что это применимо, поскольку вы получаете адрес начала массива и преобразуете его в простой указатель на базовый тип.]

Массивы должны быть смежными, поэтому они не могут вставлять элементы между элементами массива. Это правда, есть ли у вас массив int или массив массивов.

Ответ 2

Это действительно законно. В Стандарте явно утверждается, что многомерные массивы являются просто большими массивами 1D. У меня нет точной цитаты, но я знаю, что это правда.