Не используйте sizeof для параметров массива
Рассмотрим приведенную ниже программу.
#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; } |
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное в приведенной выше статье или хотите поделиться дополнительной информацией по обсуждаемой выше теме.