2015-05-30 3 views
-1

Стандарт определяет тип массива досконально, но я не вижу определения для массива.Каково определение «массив» в C?

Мы могли бы сказать «объект типа массива», однако это не может быть прав, поскольку нетипизированные объекты (например, пространство, выделенное malloc) описывается как массив.


Мотивация: Спецификация %s в fprintf (С11 7.21.6.1/8) говорит:

аргумент должен быть указателем на начальный элемент массива символов типа

но возьмите код char s[] = "hello"; printf("%s", s+1);, затем мы передали указатель на второй элемент. Это определение, по-видимому, предполагает, что матрица означает любой набор смежных объектов.


Edit: видя, как я взял некоторые «неясно, что вы просите» голосов, на мой вопрос: Что такое определение термина массив, как используется ISO/IEC 9899: 2011?

+0

C FAQ - полезный ресурс: [Так что подразумевается под «эквивалентностью указателей и массивов» в C?] (Http://c-faq.com/aryptr/aryptrequiv.html) –

+0

C++ имеет схожие проблемы. Например, он никогда не говорит, что объект представляет собой массив символов; он только говорит, что это «последовательность символов» ... В C++ просто нет, что никто не вернулся и тонко расчесывал основной стандарт. Здесь полно неясностей. Я полагаю, что C находится в аналогичной позиции. Не стесняйтесь открывать проблему, в идеале с формулировкой. (Тем не менее, я думаю, что C заморожен, он не получит никаких будущих стандартных релизов.) –

+0

@ KerrekSB звучит как кошмар :) –

ответ

0

Массивы определены в пункте 20 в C Standard, 6.2.5,:

Тип массива описывает смежно выделенную непустое множество объектов с определенным типом объекта член, называемый тип элемента. Типы массивов характеризуются их типом элемента и числом элементов в массиве. Тип массива называется производным от его типа элемента , а если его тип элемента - T, тип массива - , иногда называемый «массивом T». Конструкция типа массива из типа элемента называется «выводом типа массива».

+1

Это определение типа * массива *, а не * массива *. –

+0

@Drop Существуют массивы, которые не имеют тип массива (например, пространство, выделенное 'malloc'). Другими словами, все объекты типа массива являются явно массивами, но есть и другие массивы. –

+0

Пожалуйста, объясните, как любой «массив» может ** не быть «типа массива». –

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