Страницы

Поиск по вопросам

четверг, 4 апреля 2019 г.

Определение размера массива

Обычно делают так:
sizeof / sizeof [0]
Но ведь, — указатель на первый элемент ( == &[0]). Тогда почему sizeof возвращает корректный размер массива. Нигде же не хранится его размер.


Ответ

Если name_array объявлен именно как массив, то объект name_array - не указатель на первый элемент. name_array - это именно массив. Значение типа массив, однако, может неявно приводиться к указателю на свой первый элемент. И в языке С массив действительно сам по себе неявно приводится к указателю на свой первый элемент во всех контекстах, за исключением четырех
Операнд оператора sizeof Операнд унарного оператора & Строковый литерал-инициализатор для символьного массива Операнд оператора _Alignof
Ваш случай - как раз один из тех, в которых массив остается массивом. Поэтому sizeof возвращает размер массива, а не размер указателя.
Ваше замечание про "Нигде же не хранится его размер" не совсем понятно. "Классический" sizeof является выражением (константой) времени компиляции. Размер любого типа, разумеется, известен компилятору на стадии компиляции. sizeof же примененный к VLA вычисляется во время выполнения, но размер VLA как раз таки действительно хранится во время выполнения.

Комментариев нет:

Отправить комментарий