我有一个小问题:我可以计算向量的长度,但仅当向量在同一函数中定义时才可以.当我尝试将向量传递给另一个函数时,它返回错误的输出,我不明白为什么.
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
6
1
Run Code Online (Sandbox Code Playgroud)
为什么功能len()不起作用?它应该返回6而不是1.
这是因为数组在传递给函数时会衰减为指向其第一个元素的指针.
没有与数组关联的长度的运行时存储,因此这不起作用.基本上为函数参数,例如,如上所述类型int a[]是用等效int *a的,即它只是一个指针.
当你需要将数组传递给函数时,最好总是传递一个长度,而你永远不会有像你这样的函数len().当然,例外情况是您将自己的长度存储在指向的数据中,就像字符串使用终结符字符一样.
作为一个风格点,这段代码在main():
printf("%d\n", sizeof(a)/sizeof(int));
Run Code Online (Sandbox Code Playgroud)
在我看来更好地写为:
printf("%zu\n", sizeof a / sizeof *a);
Run Code Online (Sandbox Code Playgroud)
具有以下值得注意的变化:
sizeof有类型的结果size_t,这不是一个int.它由格式说明符正确打印%zu.sizeof不是一个函数,因此在大多数情况下不需要括号.sizeof *a表示" a指向的值的大小".sizeof绑定比绑定更严格/,因此表达式确实意味着(sizeof a) / (sizeof *a),这是期望的结果.