当我设计一个需要采用可变长度数组的c函数时,我该如何选择:
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);
答案 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,这很可能是合法输入的一部分。