我遇到了一个小问题:我可以计算一个 vector 的长度,但前提是该 vector 是在同一个函数中定义的。当我尝试将 vector 传递给另一个函数时,它返回错误的输出,我不明白为什么。
#include <stdio.h>
int len(int vec[]);
main()
{
int a[6];
printf("%d\n", sizeof(a)/sizeof(int));
printf("%d\n", len(a));
return 0;
}
len(int vec[])
{
return sizeof(vec)/sizeof(int);
}
输出是:
6
1
为什么函数 len()
不起作用?它应该返回 6 而不是 1。
最佳答案
这是因为数组在传递给函数时退化为指向其第一个元素的指针。
没有与数组关联的长度的运行时存储,所以这行不通。基本上对于函数参数,类型如 int a[]
等同于 int *a
,即它只是一个指针。
当您需要将数组传递给函数时,最好总是简单地传递一个长度,并且您永远不能拥有像您的 len()
这样的函数。当然,如果您自己将长度存储在指向的数据中,则异常(exception),就像字符串使用终止符一样。
作为文体点,main()
中的这段代码:
printf("%d\n", sizeof(a)/sizeof(int));
在我看来最好写成:
printf("%zu\n", sizeof a / sizeof *a);
具有以下值得注意的变化:
sizeof
的结果类型为size_t
,它不是int
。它由格式说明符%zu
正确打印。- 请注意
sizeof
不是函数,因此在大多数情况下不需要括号。 - 更喜欢引用变量,而不是重复可能与变量关联或不关联的类型名称。
sizeof *a
表示“a
指向的值的大小”。 - 另请注意,根据 C's operator precedence rules ,
sizeof
比/
绑定(bind)得更紧,所以表达式的真正含义是(sizeof a)/(sizeof *a)
,这就是想要的结果。
关于c - vector 的长度,初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14644219/