【发布时间】:2021-11-20 18:24:20
【问题描述】:
我知道可以通过 sizeof(the_array)/sizeof(the_array[n]) 计算数组元素的数量,但是如果我必须编写一个函数,我不知道该怎么做
【问题讨论】:
我知道可以通过 sizeof(the_array)/sizeof(the_array[n]) 计算数组元素的数量,但是如果我必须编写一个函数,我不知道该怎么做
【问题讨论】:
不可能在函数调用的参数中传递数组类型的对象(除非数组作为结构或联合类型的成员嵌入),因为数组“衰减”到指向其第一个元素的指针(C11 6.3.2.1/3)。
此外,函数声明中任何数组类型的参数都将自动调整为指针类型。例如,声明 int foo(const int bar[5]) 会自动调整为 int foo(const int *bar)(C11 6.7.5.3/7 或 C17 6.7.6.3/7)。
可以定义一个宏来获取数组的长度,但是程序员要确保参数确实是一个数组而不是一个指针:
#define ARRAYLEN(arr) (sizeof (arr) / sizeof *(arr))
例如,它不能用在函数的参数上,即使函数的参数类型看起来像一个数组,因为函数的参数类型实际上是一个指针:
#define ARRAYLEN(arr) (sizeof (arr) / sizeof *(arr))
size_t foo(int bar[5])
{
return ARRAYLEN(bar); // INCORRECT! bar is a pointer, not an array.
}
【讨论】:
不,不是你的意思。
当数组用作函数参数时,它会自动转换为指向其第一个元素的指针。 C 标准仅指定此指针指向数组的第一个元素,而不是包含有关数组的任何其他信息。 C 标准也没有规定有任何方法可以从指针或传递给函数的任何其他信息中获取数组的大小。
如果您希望函数知道数组的大小,请将大小作为单独的参数传递。
(C 实现可能会提供此信息,方法是将其包含在指针中,将其与指针关联,或将其存储在数组的开头之前。我不知道有任何这样做,除了调试功能可能会提供此信息。)
【讨论】:
int 值可以成为一个好的哨兵。 0x00 不是每个定义的有效字符串组件,但 0x00000000 是一个完全有效的 32 位 int,甚至是常见的。不过,int* 的数组可以由 null 终止。