Является ли законным доступ к двумерному массиву, как если бы он был одномерным?
Возможный дубликат:
Можно ли рассматривать 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. У меня нет точной цитаты, но я знаю, что это правда.