我正在尝试编写一个函数,如果值在数组中,则返回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个元素。为什么呢?
答案 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