【发布时间】:2012-01-06 07:55:53
【问题描述】:
这是在 C 中计算数组长度的众所周知的代码:
sizeof(array)/sizeof(type)
但我似乎无法找出作为参数传递给函数的数组的长度:
#include <stdio.h>
int length(const char* array[]) {
return sizeof(array)/sizeof(char*);
}
int main() {
const char* friends[] = { "John", "Jack", "Jim" };
printf("%d %d", sizeof(friends)/sizeof(char*), length(friends)); // 3 1
}
我假设数组作为常量指针按值复制到函数参数,对它的引用应该可以解决这个问题,但是这个声明是无效的:
int length(const char**& array);
我发现传递数组长度作为第二个参数是多余的信息,但是为什么main的标准声明是这样的:
int main(int argc, char** argv);
请解释是否可以在函数参数中找出数组长度,如果可以,为什么main中有冗余。
【问题讨论】:
-
数组是二等 C 公民。在大多数情况下,它们会衰减为指向其第一个元素的指针。这发生在函数调用(和原型)中。在您的示例中,
friends数组衰减为传递给函数的指针(在函数内部它仍然是指针) -
func(type* array[]) == func(type** array), 信息为数组,栈可能会丢失。
-
可能的重复是相关的,但没有那么密切相关。
-
请注意,空指针解决方案不是确定从函数内部传递给函数的数组大小问题的通用解决方案。实际上,一般来说,您无法确定从函数内部传递给函数的数组的大小,并且该大小通常作为另一个参数传入(考虑,除其他外,
fgets()、qsort()、fread(),fwrite()在标准 C 库中)。