Вычислите сложность и объясните, почему следующий C-функция не возвращает длину массива, а также предложите корректный способ узнать длину массива в функции:
int length(int *a) { return sizeof(a) / sizeof(a[0]); }

29 Окт в 09:22
3 +1
0
Ответы
1
Сложность: O(1). Операция sizeof\text{sizeof}sizeof вычисляется на этапе компиляции (или читает фиксированный размер типа), поэтому выражение занимает постоянное время.
Почему функция не возвращает длину массива:
- В прототипе параметр `int *a` представляет указатель, а не сам массив. Внутри функции `a` — указатель, поэтому sizeof(a)\text{sizeof}(a)sizeof(a) даёт размер указателя, а не общий размер массива в байтах.
- Выражение, которое вы написали, фактически равно
sizeof(pointer)sizeof(int), \frac{\text{sizeof}(\text{pointer})}{\text{sizeof}(\text{int})},
sizeof(int)sizeof(pointer) ,
например на 64‑битной системе это обычно 84=2\frac{8}{4}=248 =2, что не имеет отношения к реальной длине массива.
Как корректно узнать длину массива в функции:
1) Передать длину явно:
- Сигнатура: `int length(int *a, size_t n) { return n; }`
- Вызов: `length(arr, n);` или вычисление на месте при наличии массива: `length(arr, sizeof(arr)/sizeof(arr[0]));`
- При этом выражение вычисления на месте (в вызывающем контексте) можно оформить макросом:
`#define LEN(x) (sizeof(x)/sizeof((x)[0]))` — работает только если `x` действительно массив в момент вызова.
2) Использовать терминатор (sentinel), если возможен специальный маркер конца:
- Например, массив заканчивается нулём; функция перебирает до первого 0\,00.
3) Хранить длину вместе с массивом в структуре:
- `struct { size_t len; int *data; }` или использовать гибкий массив `struct { size_t len; int data[]; };`
4) Платформенно‑зависимые дополнения (не рекомендованы): функции типа `malloc_usable_size`/`_msize` могут дать размер выделенного блока, но они не стандартны и ненадёжны для определения логической длины массива.
Рекомендация: самый простой и переносимый способ — всегда передавать длину массива в аргументе функции (вариант 1) или вычислять длину с помощью `sizeof` в том месте кода, где у вас действительно есть объект‑массив (макрос `LEN`).
29 Окт в 09:53
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир