c - vector 的长度,初学者

标签 c function vector

我遇到了一个小问题:我可以计算一个 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/

相关文章:

c++ - 在 C++ 程序中使用 C 链接时参数丢失

c - 无法使用c打开文件

c - OpenCV 中的 XML 解析器

ios - Swift iOS - 循环运行速度是否比 Date().timeIntervalSince1970 生成的日期秒快

Excel自带函数: Compile error: Sub or Function not defined

c++ - c++ 中二维 vector 的 cout 缺失行

c - 程序输出错误的总和

MySQL 简单函数不适用于变量声明

c++ - 如何逐个添加两个 STL vector 的元素?

c++ - 通过指针用自定义类填充 vector - 构造函数有问题