Почему размер массива равен 1 [дубликат]

Possible Duplicate:
Sizeof an array in the C programming language?

Я пытаюсь написать функцию, которая возвращает 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++){
    ...
  }
}
 27 июн. 2012 г., 13:46
@Lundinsizeof(*iArray) само по себе не так. И применение исправления, как описано, удалит этот источник ошибок.
 27 июн. 2012 г., 13:09
Он на самом деле делаетint arrayL=sizeof(int)/sizeof(int);в коде есть две ошибки, и вы обращаетесь только к одной.

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

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

 Antonio Ciccia27 июн. 2012 г., 12:35
Итак, как я могу решить это?

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

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

 27 июн. 2012 г., 12:39
В качестве идентификатора, ОП совершил еще одну ошибку, выполнивsizeof(*iArray).

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

Ваш ответ на вопрос