11

可能重复:
作为参数传递的 Sizeof 数组

我想知道为什么以下代码的输出是 1 和 9。这是因为函数大小中未声明的数组吗?如何将“数组大小”分离为函数?

#include "stdafx.h"
#include <iostream>
using namespace std;

int size(int a[])
{
    return sizeof a/sizeof a[0];
}

int main()
{   
    int a[] = {5,2,4,7,1,8,9,10,6};
    cout << size(a) << endl;
    cout << sizeof a/sizeof a[0] << endl;
    system("pause");
    return 0;
}
4

7 回答 7

12

当您编写时size(a),您传递的是指针而不是数组。由于指针和 an 的大小int是 4 或 8(取决于 ABI),因此您会得到sizeof(int *)/sizeof int4/4=1用于 32 位机器,8/4=2用于 64 位机器),即12

在 C++ 中,当将数组作为参数传递给函数时,实际上是在传递指向数组的指针。

于 2012-11-21T10:00:45.453 回答
8

Maroun85 的答案是正确的。这并不明显,但ainint size(int a[])是一个指针。

但是你为什么不以 c++ 的方式来做呢。使用std::vector_

std::vector<int> a = {5,2,4,7,1,8,9,10,6};
cout << a.size() << endl;

这里没有技巧

- 编辑

如果您的编译器不支持 c++11。你可以做:

std::vector<int> a;
a.push(5);
a.push(2);
...
cout << a.size() << endl;
于 2012-11-21T10:04:34.083 回答
6

您的size()函数不能像您希望的那样工作,因为当您将数组传递给函数时,数组会衰减为指向其第一个元素的指针。您a衰减到int*指针上的 a 和 sizeof 运算符返回指针的大小,而不是数组。考虑使用 astd::vector<int>代替,因为这将允许您在每次将向量传递给函数时检索向量的大小。

于 2012-11-21T10:00:42.373 回答
5

将数组传递给函数时,它们会衰减为指针。因此,您的size()功能相当于:

int size(int* a)
{
    return sizeof a/sizeof a[0];
}

Andsizeof a是指针的大小,与此处的 int 大小相同,因此是输出。

于 2012-11-21T10:01:34.857 回答
4

为什么您的解决方案不起作用的最佳解释是 Maroun 的回答。

关于问题的第二部分(“怎么做?”),您可以使用模板函数执行此操作:

template <typename T, size_t n> const size_t size(const T (&)[n]) { return n; }

当然,这只有在数组的大小是常量时才有效(常量,如编译器所见),但无论如何它只能在这种情况下工作——数组不会在任何地方存储它的大小,所以如果它不是已知的编译时常数,没有办法知道它。

如果您需要它来处理不是编译时常量的数组(例如,您使用 分配的东西operator new[],或使用非标准编译器扩展),您需要在某处显式存储大小。

(顺便说一下,我上面的陈述在技术上是错误的,实际上分配大小通常是存储的,但这是一个你不能也不应该依赖的实现细节。)

于 2012-11-21T10:17:21.827 回答
4

请记住,数组总是通过指针传递。

因此,函数a中有一个指向 的指针int,并且(对于 32 位整数)指向的指针的大小与 aint的大小相同int

于 2012-11-21T10:00:47.150 回答
4

sizeof在编译时评估,而不是在运行时评估。编译器不会分析您传递给 function的内容size,而是将 function 参数视为指针。因此,在您的函数size中,结果sizeof a是指向an的指针int的大小,偶然地,它等于int系统上 an 的大小。

于 2012-11-21T10:01:19.113 回答