当数组作为函数的参数传递时,如何找出数组的大小?

时间:2014-01-03 05:13:28

标签: c

我传递一维数组作为函数的参数。如何找出被调用函数中数组的大小?

以下是示例代码:

# include<stdio.h>

int test( int array[ ] ) {
    //find the size of an array
}

int main() {

    int array[ ] = { 1,2,3,4};
    test( array );
    return 0;
}

4 个答案:

答案 0 :(得分:4)

传递给函数时,数组会衰减为指针。仅使用指针,您无法获得数组的大小。您必须再向调用函数传递一个参数,该函数是数组的大小。 例如:

#include <stdio.h>
void test(int myArray[10], int size)
{
    printf("Size of myArray = %d\n", size);
}
void fun(int myArray[10])
{
    int i = sizeof(myArray);
    printf("Size of myArray = %d\n", i);
}
// This function prints the output 4 
int main(void)
{
    int myArray[10] = {0}; 
    fun(myArray);
    test(myArray, sizeof(myArray));
    getchar();            ^----------------Here you are passing the size
    return 0;
}

这将打印输出40(假设平台上sizeof int为4)

答案 1 :(得分:3)

您有两种选择:

int len_array1(int array[], int n) {
  return n;
}

int len_array2(int array[]) {
  int i;
  for(i=0;array[i]!=-1;++i) {}
  return i;
}

int main() {
  int array1[] = {1,2,3,4};
  int array2[] = {1,2,3,4,-1};

  operate_on_array1(array1,4);
  operate_on_array2(array2);
}

你可以以某种方式存储数组的长度(或保持一个点到它的结尾)并传递它,或者你可以在数组的末尾包含一个特殊值,否则它将不会出现在值内数组。

许多C风格的函数更喜欢第一个选项(len_array1),但C风格的字符串使用第二个选项(特殊值为0x00\0字符)。< / p>

答案 2 :(得分:1)

您不能在 C 中执行此操作,如 Java 等,但另一种方法是发送END标记字符,例如, 0xFFFF以便您可以在找到数据后停止阅读。

这当然只是一种解决方法,并且可能只在这种情况下使用,如果你绝对肯定那些数据不会发生。

答案 3 :(得分:1)

基本上,有三种方法: -

1)结束标记字符: - 这种方式只有在你可以非常确定角色不会出现在作为争论传递的数组中的任何地方时才有用。

2)使用始终指向数组末尾的指针: -
现在假设,结束指针是ptr_end,那么你可以计算两个指针所指向的地址的差异(一个是结束指针而另一个是数组的名称),除以它sizeof(int),如果在数组中存储int变量: -

3)将sizeof(array)作为该函数的第二个论点。正如另一个答案所证明的那样。

在你的情况下,似乎第一种和第三种方式比第二种方式易于实现。