矢量的长度,初学者

Jou*_*uge 2 c function 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);
}    
Run Code Online (Sandbox Code Playgroud)

输出是:

6
1
Run Code Online (Sandbox Code Playgroud)

为什么功能len()不起作用?它应该返回6而不是1.

unw*_*ind 7

这是因为数组在传递给函数时会衰减为指向其第一个元素的指针.

没有与数组关联的长度的运行时存储,因此这不起作用.基本上为函数参数,例如,如上所述类型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指向的值的大小".
  • 还要注意,根据C的运算符优先级规则,sizeof绑定比绑定更严格/,因此表达式确实意味着(sizeof a) / (sizeof *a),这是期望的结果.