将可变长度数组传递给函数,我应该使用数组长度参数还是数组结束标记?

时间:2013-05-27 17:19:42

标签: c

当我设计一个需要采用可变长度数组的c函数时,我该如何选择:

  1. 添加另一个参数来给出数组长度?和
  2. 使用特殊标记(例如'\ 0')终止数组?
  3. 其他一些选择?什么?
  4. E.g。

    void myfunc(int arr[], int arr_length) { ... }
    ...
    int arr[3] = { 1, 2, 3 };
    myfunc(myarr, 3);
    

    void myfunc(int arr[]) { ... }
    ...
    int arr[4] = { 1, 2, 3, '\0' };
    myfunc(arr);
    

2 个答案:

答案 0 :(得分:1)

惯例是传递数组长度,除非数组是字符数组(即字符串);在这种情况下,C将自动使用0x00对字符串进行空终止。

您可以使用您选择的null终止符来终止数组。例如,如果你有一个有符号整数的数组,但不知怎的,你知道它们都不是负数,你可以使用-1(或任何负数)。使用null-terminators的问题是您丢失了一些可能的值。例如,采用4位长的数据类型。如果我将0b1111定义为终结符,那么我可以放入此类型数组中的最大值为0b1110。字符串为空终止的原因是在ASCII中,0到255之间的数字比我们想要表达的字符多,所以使用null-terminator不需要任何费用。

如果传递数组长度并循环遍历数组中的所有值,那么您将自动拥有在for循环中使用的最大值。此外,在C中,您几乎总是在创建数组时知道数组的长度。

编辑:就传递数组结束标记而言,它对于您在计算机上运行的程序来说应该不是问题,但我会重新考虑,因为不同的硬件实现具有不同大小的数据类型。如果您的计算机上有一个4位(16位)的数组,则从0x1000开始的阵列将在您的计算机上以0x1008(例如)结束,但在我的计算机上将以0x1004结束。

答案 1 :(得分:0)

int arr_length声明为全局变量。不需要通过它。

将长度作为参数传递。但绝不要使用特殊字符作为结束标记。如果您通过'\0' int arr[4] = { 1, 2, 3, '\0' };。然后arr[3]将存储等效于'\0' 0 )的ASCII,这很可能是合法输入的一部分。