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

Опубликовано: 16 Декабря, 2021

Рассмотрим приведенную ниже программу.

#include<stdio.h>
void fun( int arr[])
{
int i;
/* sizeof should not be used here to get number
of elements in array*/
int arr_size = sizeof (arr)/ sizeof (arr[0]); /* incorrect use of sizeof*/
for (i = 0; i < arr_size; i++)
{
arr[i] = i; /*executed only once */
}
}
int main()
{
int i;
int arr[4] = {0, 0 ,0, 0};
fun(arr);
/* use of sizeof is fine here*/
for (i = 0; i < sizeof (arr)/ sizeof (arr[0]); i++)
printf ( " %d " ,arr[i]);
getchar ();
return 0;
}

На выходе: 0 0 0 0 на машине IA-32.

Функция fun () получает параметр массива arr [] и пытается узнать количество элементов в arr [] с помощью оператора sizeof.
В C параметры массива обрабатываются как указатели (подробности см. Здесь). Таким образом, выражение sizeof (arr) / sizeof (arr [0]) становится sizeof (int *) / sizeof (int), что приводит к 1 для 32-битной машины IA (размер int и int * равен 4), а цикл for внутри fun () выполняется только один раз, независимо от размера массива.

Следовательно, в таких случаях не следует использовать sizeof для получения количества элементов. Отдельный параметр для размера (или длины) массива должен быть передан в fun (). Итак, исправленная программа:

#include<stdio.h>
void fun( int arr[], size_t arr_size)
{
int i;
for (i = 0; i < arr_size; i++)
{
arr[i] = i;
}
}
int main()
{
int i;
int arr[4] = {0, 0 ,0, 0};
fun(arr, 4);
for (i = 0; i < sizeof (arr)/ sizeof (arr[0]); i++)
printf ( " %d " , arr[i]);
getchar ();
return 0;
}

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

Хотите узнать больше о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровней C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .