为什么数组大小为1

时间:2012-06-27 10:31:32

标签: c arrays sizeof

  

可能重复:
  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 个答案:

答案 0 :(得分:6)

因为当您将函数作为参数传递给函数时,数组会衰减到指针。所以sizeof(array)不会给你数组的大小,而是指针的大小。

您可以将数组大小设置为extra argument,也可以将数组作为reference传递,以便sizeof(数组)可以为您提供正确的大小。 (详见:What is array decaying?

答案 1 :(得分:2)

参数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++){
    ...
  }
}

答案 2 :(得分:1)

传递给函数的是指向数组的指针,无法知道大小。指针的大小是int的大小,因此是1

如果你想迭代它,你需要在函数的参数中传递数组的大小。

答案 3 :(得分:1)

我会在数组大小中添加一个额外的参数:

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