После горячей темы комментариев в другом вопросе я пришел к обсуждению того, что есть и что не определено в стандарте C99 о C массивах.
В основном, когда я определяю 2D-массив, такой как int a[5][5]
, может ли стандартная гарантия C99 или нет, что он будет непрерывным блоком ints, могу ли я применить его к (int *)a
и быть уверенным, что у меня будет действующий массив 1D из 25 ints.
Как я понимаю, стандартное свойство выше подразумевается в определении sizeof и в арифметике указателя, но другие, похоже, не согласны и говорят, что кастинг (int *) приведенной выше структуры дает поведение undefined (даже если они согласны с тем, что все существующие реализации фактически распределяют смежные значения).
В частности, если мы думаем о реализации, которая позволяла бы инструментальным массивам проверять границы массива для всех измерений и возвращать некоторую ошибку при доступе к массиву 1D или не предоставлять правильный доступ к элементам выше 1-й строки. Может ли такая реализация быть стандартным компилятором? И в этом случае важны части стандарта C99.