【问题标题】:Length of a vector, beginner向量的长度,初学者
【发布时间】:2013-02-01 10:25:55
【问题描述】:

我有一个小问题:我可以计算向量的长度,但前提是向量是在同一个函数中定义的。当我尝试将向量传递给另一个函数时,它会返回错误的输出,我不明白为什么。

#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。

【问题讨论】:

标签: c function vector


【解决方案1】:

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

没有与数组关联的长度的运行时存储,所以这不起作用。基本上对于函数参数,int a[] 等类型与int *a 等价,即它只是一个指针。

当您需要将数组传递给函数时,最好总是简单地传递一个长度,并且您永远不能拥有像 len() 这样的函数。当然,如果您自己将长度存储在指向的数据中,则例外情况,就像字符串对终止符所做的那样。

作为文体点,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 rulessizeof 的绑定比/ 更紧密,所以表达式真正的意思是(sizeof a) / (sizeof *a),这就是预期的结果。

【讨论】:

  • 编写一个计算长度的函数,传递它一个长度似乎有点没用:) 但我理解。非常感谢。
【解决方案2】:

您的len 函数将一个未指定大小的数组作为参数,在这种情况下,它被视为只是一个指针类型(在您的情况下为int 指针)。在您的特定平台上,指针的大小与 int 的大小相同,因此 sizeof(vec)/sizeof(int) 为 1。

如果您明确指定数组参数的长度,那么您的大小计算将按预期运行——但您的函数将只采用该长度的数组参数。

另请参阅:C++ arrays as function arguments

【讨论】:

    【解决方案3】:

    因为int len(int vec[]) 实际上是int len(int *vec)。在len 内部,变量vec 被视为一个指针,因此sizeof vec 返回保存地址所需的字节数。

    请注意,sizeof 是一个运算符,而不是一个函数。这意味着sizeof 返回的值是在编译时计算的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多