До сих пор это было так, но после того, как я узнал, что компилятор может помещать данные, чтобы выровнять его для требований к архитектуре, например, я сомневаюсь. Поэтому мне интересно, имеет ли char[4][3]
такой же формат памяти, что и char[12]
. Может ли компилятор добавить прокладку после части char[3]
, чтобы она была выровнена так, что весь массив принимает на самом деле 16 байтов?Гарантируется ли тот факт, что тип T [x] [y] имеет тот же формат памяти, что и T [x * y] в C?
История вопроса о том, что функция библиотеки берет связку строк фиксированной длины в параметре char*
, поэтому он ожидает непрерывный буфер без paddig, а длина строки может быть нечетной. Поэтому я подумал, что объявляю массив char[N_STRINGS][STRING_LENGTH]
, а затем удобно заполнил его и передал его функции, отбросив его до char*
. Пока это работает. Но я не уверен, что это решение переносимо.
Массив смежно распределен. Между элементами массива IMHO не должно быть никаких дополнений. – ameyCU
C массивы должны быть непрерывными, без отступов между элементами массива. Поэтому ни 'char [4] [3]', ни 'char [12]' не может содержать отступы, а 'sizeof' будет' 12 * sizeof (char) 'для обоих. –
Также см. [Матрицы Can C содержат отступы между элементами?] (Http://stackoverflow.com/questions/1066681/can-c-arrays-contain-padding-in-between-elements) –