gpt4 book ai didi

c - vector 的长度,初学者

转载 作者:行者123 更新时间:2023-12-02 06:19:32 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com