2016-06-27 13 views
2

Я знаю, что this answer нарушает reinterpret_cast rules, но также предполагает, что субмассивы будут распределяться линейно.Поддерживаются ли линейные массивы под-массивов?

Я полагал, что это не было гарантировано, но, когда я ищу стандарт, я нахожу, что моя уверенность колеблется. Если я статически выделяю 2D-массив, например:

int foo[][4] = { { 5, 7, 8 }, 
       { 6, 6 }, 
       {}, 
       { 5, 6, 8, 9 } }; 

Я позволил предположить, что все элементы будут распределены линейно? То есть сказать, что если foo[0] находится по адресу 0x00000042, будет:

  • foo[1] быть по адресу 0x00000052
  • foo[2] быть по адресу 0x00000062
  • foo[3] быть по адресу 0x00000072

Эти адреса находятся в шестнадцатеричном формате, и да, они предоставляют пространство для 4-элементной подматрицы с sizeof(int) == 4; они могут и не могут быть инициализированы нулем.

+0

Если 'foo [0]' находится по адресу '0x00000042',' foo [1] 'будет находиться по адресу' 0x00000052', только если 'sizeof (int)' is '4'. Я подозреваю, что вы предположили, что 'sizeof (int)' is '4'. –

+1

@NathanOliver Это определенно не обман, так как он 'malloc' хранит память в цикле, так что вы абсолютно не гарантируете, что можно сделать о макете этих подмассивов в памяти. –

+0

@JonathanMee Вопрос не одинаков, но ответы описывают статический 2d-массив, а не динамически выделенный массив указателей. следовательно, от меня никто не голосовал. – NathanOliver

ответ

5

Являются ли вспомогательные массивы гарантированно распределяемыми линейно?

Да. Являются ли элементы массива субмассивами или объектами без массива, они гарантированно сохраняются в памяти в памяти.

Для полноты здесь стандартная цитата:

[dcl.array]

  1. [надрез] Объект типа массива содержит смежно выделенной непустого множества N подобъекты типа T. [надрез]

Там не исключение для случая, когда T - массив.


Итак, мы знаем, что это не гарантируется в случае const char[4].

Наоборот, мы знаем, что это является гарантировано char[4] объектов так же, как это гарантировано для других типов.

Например: const char first [] = "foo"; символ Foo [] [4] = { "бар", "Foo", "", "Баз"}

first будет храниться как это в памяти:

{'f', 'o', 'o', '\0'} 

foo будет храниться как это:

{'b', 'a', 'r', '\0', 'f', 'o', 'o', '\0', '\0', '\0', '\0', '\0', 'b', 'a', 'z', '\0'} 

Так почему бы вам сказать, что это гарантировано Интс?

Это гарантировано для int[4], char[4] и любого другого типа, что вы можете себе представить.

+1

Итак, мы знаем, что это не гарантируется для 'const char [4]'. Например: 'const char first [] =" foo "; char foo [] [4] = {"bar", "foo", "", "baz"} 'Так почему бы вам сказать, что это гарантировано для' int'? –

+0

@JonathanMee, они будут, если вы используете 'char foo [] [4] = {{'b', 'a', 'r', '\ 0'}, ...};'. –

+1

@RSahu: Они будут, даже если вы используете 'char foo [] [4] = {" bar "," foo "," "," baz "}' - Не знаете, почему он думает иначе. –

3

от языка C стандарта ИСО/МЭК 9899 §6.2.5 Типы/р20 (курсив мой):

Тип массива описывает смежно выделенную непустое множество объектов с конкретный тип объекта-члена, называемый типом элемента.

Кроме того, из языка C стандарта ИСО/МЭК 9899 §6.5.2.1/р3 индексацией массивов (Упор Шахта):

Последовательные подстрочные операторы назначают элемент многомерного массива объект. Если E является п-мерный массив (п> = 2) с размерами i x j x . . . x k, то E (используется как кроме именующее) преобразуется в указатель на массив (n - 1)-мерного с размерами j x . . . x k. Если унарный * применяется оператор к этому указателю явно или неявно в результате индексации, результата заостренным к (n - 1)-мерный массив, который сам преобразуется в указатель, если используется в качестве других, чем Lvalue. Из этого следует, что массивы хранятся в строчном порядке (последний индекс меняется быстрее).

Из вышесказанного можно сделать вывод о том, что 2D-массив фактически представляет собой 1D-массив, хранящийся в строчном порядке.

Следовательно, можно с уверенностью предположить, что элементы подматрицы хранятся смежно в памяти.

 Смежные вопросы

  • Нет связанных вопросов^_^