Не используйте sizeof для параметров массива в C

Опубликовано: 15 Сентября, 2022

Непосредственное использование sizeof для определения размера массивов может привести к ошибке в коде, поскольку параметры массива рассматриваются как указатели. Рассмотрим приведенную ниже программу.

Объяснение: Этот код генерирует ошибку, так как функция fun() получает параметр массива 'arr[]' и пытается определить количество элементов в arr[] с помощью оператора sizeof.
В C параметры массива рассматриваются как указатели (подробности см. здесь). Итак, выражение sizeof(arr)/sizeof(arr[0]) становится sizeof(int *)/sizeof(int) , что приводит к 2 (размер int* равен 8 байтам, потому что это указатель, а указатель занимает 8 байтов memory и int равно 4), а цикл for внутри fun() выполняется только два раза, независимо от размера массива. Следовательно, sizeof не следует использовать для получения количества элементов в таких случаях.

Решение:

1) Использование отдельного параметра: в fun() следует передать отдельный параметр типа данных size_t для размера или длины массива. size_t — целочисленный тип без знака длиной не менее 16 бит. Итак, исправленная программа будет:

2) Использование макросов: мы даже можем определить макросы , используя #define , чтобы найти размер массивов, как показано ниже,

3) Использование арифметики указателя: мы можем использовать (&arr)[1] – arr , чтобы найти размер массива. Здесь arr указывает на первый элемент массива и имеет тип int*. Кроме того, &arr имеет тип int*[n] и указывает на весь массив. Следовательно, их разница эквивалентна размеру массива.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное в приведенной выше статье или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

C++ C