Рубрики

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

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

#include<stdio.h>

void fun(int arr[])  

{

  int i;   

  

  / * sizeof не должен использоваться здесь, чтобы получить номер

    элементов в массиве * /

  int arr_size = sizeof(arr)/sizeof(arr[0]); / * неправильное использование sizeof * /

  for (i = 0; i < arr_size; i++) 

  {  

    arr[i] = i;  / * выполняется только один раз * /

  }

}

  

int main()

{

  int i;  

  int arr[4] = {0, 0 ,0, 0};

  fun(arr);

    

  / * здесь можно использовать sizeof * /

  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;

}    

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

Рекомендуемые посты:

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

0.00 (0%) 0 votes