Почему размер массива равен 1

Возможный дубликат:
Размер массива на языке программирования C?

Я пытаюсь написать функцию, которая возвращает 1, если значение находится в массиве. Вот код:

int inArrayInt(int iVal, int iArray[])
{
    int i;
    int arrayL = sizeof(*iArray) / sizeof(int);
    int flag = 0;
    for(i=0; i < arrayL; i++)
    {
        if(iVal == iArray[i])
        {
            flag = 1;
        }
    }
    return flag;
}

Проблема в том, что arrayL = sizeof(*iArray) / sizeof(int); всегда оценивается в 1, даже если массив содержит 20 элементов. Зачем?

4 ответа

Решение

Как параметр int iArray[] эквивалентно int *iArray,

Итак, когда вы делаете

int arrayL=sizeof(*iArray)/sizeof(int);

Вы на самом деле делаете

int arrayL=sizeof(int)/sizeof(int);

Который такого же размера.

Вам необходимо добавить параметр, с помощью которого вы передаете информацию о размере.

int inArrayInt(int iVal, int iArray[], size_t numel){
  ...
  for(i=0;i<numel;i++){
    ...
  }
}

Потому что массив распадается на указатель, когда вы передаете его в функцию в качестве аргумента. И так sizeof(array) не даст вам размер массива, но размер указателя.

Вы можете иметь размер массива как extra argumentили передать массив как reference так что sizeof(массив) даст вам правильный размер. (Подробно здесь: что такое распадающийся массив?)

Я бы добавил дополнительный параметр с размером массива:

int inArrayInt(int iVal, int* iArray, int sizeOfArray)
{
    int i;

    for(i = 0; i < sizeOfArray; i++)
    {
        if(iVal == iArray[i])
        {
            return 1;
        }
    }

   return 0;
}

Затем вызовите функцию с размером, с которого вы инициировали массив:

int myArray[100];  


if (inArrayInt(42, myArray, 100))
   //returned true

То, что вы передаете в функцию, это указатель на массив, без возможности узнать размер. Размер указателя равен размеру целого, поэтому 1,

Вам нужно передать размер массива вместе с ним в аргументах вашей функции, если вы хотите итерировать по нему.

Другие вопросы по тегам