数组C ++的大小

时间:2012-11-21 09:56:37

标签: c++ arrays size

  

可能重复:
  Sizeof array passed as parameter

我想知道为什么以下代码的输出是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;
}

7 个答案:

答案 0 :(得分:12)

当您编写size(a)时,您传递的是指针,而不是数组。由于指针和int的大小为4或8(取决于ABI),因此对于32位计算机而言,您获得sizeof(int *)/sizeof int 4/4 = 1 <和<强> 8/4 = 2 (对于64位) 1 2

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

答案 1 :(得分:7)

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

但是你为什么不用c ++的方式呢。使用std::vector s

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;

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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

并且sizeof a是指针的大小,这与此处的int的大小相同,因此是输出。

答案 4 :(得分:3)

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

因此,在函数a中是指向int的指针,并且(对于32位整数)指向int的指针的大小与{{1}的大小相同1}}。

答案 5 :(得分:3)

sizeof在编译时进行评估,而不是在运行时进行评估。编译器不会分析您传递给函数size的内容,而是将函数参数视为指针。因此,在您的函数size中,sizeof a的结果是{em>指针到int的大小,这是偶然的,等于大小的int您系统上的{{1}}。

答案 6 :(得分:3)

解决方案无效的最佳解释是Maroun的回答。

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

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

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

如果您需要使用它来处理编译时常量的数组(例如,您使用operator new[]分配的内容,或使用非标准编译器扩展),则需要明确地将大小存储在某处。

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