0

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

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

例如

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);
4

2 回答 2

1

约定是传递数组长度,除非数组是字符数组(即字符串);在这种情况下,C 将自动以 0x00 结束字符串。

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

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

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

于 2013-05-27T17:29:52.553 回答
0

声明int arr_length为全局变量。那就不用通过了。

或者

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

于 2013-05-27T17:24:07.937 回答