В общем, с точки зрения доступа к памяти это нормально, потому что, если операнд sizeof
имеет тип VLA, это не оценено. Таким образом, в этом случае x[0]
не является недопустимым доступом к памяти.
Цитирование C11
, глава §6.5.3.4, курсив мой
Оператор sizeof
дает размер (в байтах) своего операнда, который может быть выражение в скобках или имя типа , Размер определяется по типу операндом. Результат - целое число. Если тип операнда является массивом переменной длины , операнд оценивается; в противном случае операнд не оценивается, а результат - целочисленная константа .
В широком смысле, для массива, как
int arr[5]= {0};
написание
sizeof(arr)/sizeof(arr[10]);
также действует в arr[10]
не оценивается, это только о размере операнда , а не содержание (так что не требует разыменования).
Тем не менее,
- нулевой длины массивы не являются стандартными С, они являются gcc extension.
sizeof
дает результаты по размеру size_t
, поэтому мы должны использовать спецификатор формата %zu
для печати результата.
Это не C++. Пустой инициализатор запрещен для массива с неопределенной привязкой – mpiatek
Это не UB, так как 'sizeof (k [0])' фактически не обращается к какой-либо памяти. Это точно так же, как 'sizeof (ka)' – rustyx