1

可能重复:
C 编程语言中数组的大小?

如果值在数组中,我正在尝试编写一个返回 1s 的函数。这是代码:

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);即使数组包含 20 个元素,它也总是计算为 1。为什么?

4

4 回答 4

6

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

您可以将数组大小设置为 a extra argument,也可以将数组作为 a 传递,reference以便 sizeof(array) 为您提供正确的大小。(此处详述:什么是数组衰减?

于 2012-06-27T10:34:28.387 回答
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++){
    ...
  }
}
于 2012-06-27T10:37:13.027 回答
1

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

如果要对其进行迭代,则需要在函数的参数中传递数组的大小。

于 2012-06-27T10:32:32.173 回答
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
于 2012-06-27T10:43:45.127 回答