【问题标题】:Size of an array C++ [duplicate]数组C ++的大小[重复]
【发布时间】:2012-11-21 09:56:37
【问题描述】:

可能重复:
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;
}

【问题讨论】:

  • 当您编写size(a) 时,您传递的是指针而不是数组。由于指针和 int 的大小相同,所以得到 1/1,即 1。
  • maroun 将其发布为答案。因为它是一个。
  • @Maroun85 为什么要评论?这是一个有效的答案。

标签: c++ arrays size


【解决方案1】:

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

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

【讨论】:

  • 问题也是“如何将“数组大小”分离为函数?”
  • @downvoter,有什么意见吗?
  • @MarounMaroun 不,大多数反对者都是愚蠢的。 :P
【解决方案2】:

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

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

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;

【讨论】:

  • +1 用于回答“如何分离 size()”问题。
  • 当我声明向量 a = {5,2,4,7,1,8,9,10,6};编译器警告a' must be initialized by constructor, not by {...}'。请为我解决这个问题。非常感谢。
【解决方案3】:

您的size() 函数不能像您希望的那样工作,因为当您将数组传递给函数时,该数组会衰减为指向其第一个元素的指针。您的 a 衰减为 int* 并且指针上的 sizeof 运算符返回指针的大小,而不是数组。考虑改用std::vector&lt;int&gt;,因为这将允许您在每次将向量传递给函数时检索向量的大小。

【讨论】:

  • @downvoter 我的回答有什么不正确的地方吗?
  • 不,有一些最喜欢投票的人。
【解决方案4】:

将数组传递给函数时,它们会衰减为指针。所以,你的size() 函数相当于:

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

sizeof a是指针的大小,这里和int的大小一样,所以输出。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      所以在函数a 中是一个指向int 的指针,并且(对于32 位整数)指向int 的指针的大小与int 的大小相同。

      【讨论】:

        【解决方案7】:

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

        关于问题的第二部分(“怎么做?”),你可以用模板函数来做:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-12
          • 1970-01-01
          • 1970-01-01
          • 2021-08-05
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          相关资源
          最近更新 更多