找到作为c中函数的参数接收的整数数组的大小

Sun*_*ari 12 c arrays

我想找到作为函数参数传递的整数数组的大小.这是我的代码

void getArraySize(int arr[]){
  int len = (sizeof(arr)/sizeof(arr[0])
  printf("Array Length:%d\n",len);
}

int main(){
 int array[] = {1,2,3,4,5};
 getArraySize(array);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下警告

sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]

请帮忙,以便我可以在里面找到整数数组的长度function getArraySize 但是我能够找到函数array内部的大小.因为main它是作为一个传递的pointer,所以无法在中找到lengthfrom function.

我确实有一个想法.我可以把它放在一个try/catch块(C没有尝试捕获,只有操作系统依赖的跳线)和循环,直到我得到一个segmentation fault.

有没有其他方法可以用来找到integer array内部的长度function

pax*_*blo 30

你不能这样做.将数组传递给函数时,它会衰减为指向第一个元素的指针,此时会丢失其大小的知识.

如果你想知道传递给函数的数组的大小,你需要衰减之前解决它并将该信息传递给数组,例如:

void function (size_t sz, int *arr) { ... }
:
{
    int x[20];
    function (sizeof(x)/sizeof(*x), x);
}
Run Code Online (Sandbox Code Playgroud)

  • 所以你总是必须将它作为参数传递?@paxdiablo (3认同)

Jay*_*hoi 7

传递时,数组衰减为指针。

因此,如果将sizeof应用于原始数组,sizeof仅能找到该数组的长度。

因此,您需要将数组的长度作为单独的参数传递给函数。


Sat*_*ish 7

没有办法确定函数内部的长度。无论您通过什么arrsizeof(arr)都将始终返回指针大小。所以最好的方法是将元素的数量作为单独的参数传递。

sizeof 如果将其应用于原始数组,则仅适用于查找数组的长度。

int arr[5]; //real array. NOT a pointer
sizeof(arr); // :)
Run Code Online (Sandbox Code Playgroud)

但是,当数组衰减为指针时,sizeof 将给出指针的大小而不是数组的大小。

void getArraySize(int arr[]){
sizeof(arr); // will give the pointer size
}
Run Code Online (Sandbox Code Playgroud)

关于为什么会发生这种情况有一些推理。我们怎样才能让 C 数组也知道它的长度呢?

第一个想法是在将数组传递给函数并继续将数组长度保留在类型系统中时,不要让数组衰减为指针。

当您将数组传递给函数时,它会衰减为指针。因此该sizeof函数将返回 的大小int *。这是您的编译器遵守的警告-

sizeof on array function parameter will return size of 'int *' instead of 'int []'
Run Code Online (Sandbox Code Playgroud)

正如我所建议的,当您将数组传递给函数时,您还需要传递元素数 -

getArraySize(array, 5); // 5 is the number of elements in array
Run Code Online (Sandbox Code Playgroud)

抓住它——

void getArraySize(int arr[], int element){
// your stuff
}
Run Code Online (Sandbox Code Playgroud)

计算数组大小的其他一般方法 -

void getArraySize(int arr[], int len){
  // your stuff
  printf("Array Length:%d\n",len);
}

int main(){
 int array[] = {1,2,3,4,5};
 int len = (sizeof(arr)/sizeof(arr[0]); // will return the size of array
 getArraySize(array, len);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)


bar*_*nos 5

将数组传递给函数时,其地址作为指针传递给函数。

所以void getArraySize(int arr[])等于void getArraySize(int* arr)

结果,sizeof(arr)yields sizeof(int*)可能不是您想要的。

sizeof(arr)/sizeof(arr[0])只能在的声明范围内安全使用arr

在您的情况下,声明的范围arr是function main