【问题标题】:How to get size of const array in c++? [duplicate]如何在 C++ 中获取 const 数组的大小? [复制]
【发布时间】:2021-04-05 11:44:39
【问题描述】:
#include <iostream>
using namespace std;

const int triTable[4][6] = {
    {},
    {0, 8, 3},
    {0, 1, 9},
    {1, 8, 3, 9, 8, 1},
};

int main() {
  const int *f = triTable[3];
  int size = sizeof(f)/sizeof(*f);
  cout << size; 
}

这给了我错误的数字。它应该打印 6。我怎样才能得到它?

【问题讨论】:

  • 由于f 是一个指针,sizeof f 将是 指针 的大小,而不是它可能指向的大小。由于您使用 C++ 编程,因此有一个非常简单的解决方案:使用 std::arraystd::vector 代替,您可以轻松获取元素的数量。
  • sizeof(f)/sizeof(*f) 等于 sizeof(int *)/sizeof(int)triTable 的任一维度都没有关系。要获得第一个维度(即 4),您需要计算 sizeof(triTable)/sizeof(*triTable)。要获得第二维(即 6),您需要计算 sizeof(*triTable)/sizeof(**triTable)。您也不能使用f 来获取,因为triTable[3]int * 的转换会丢失大小信息。

标签: c++ arrays size


【解决方案1】:

如何在 c++ 中获取 const 数组的大小?

像这样:

std::size(triTable[3])

这给了我错误的数字。

您通常无法通过使用指向该数组元素的指针来获取数组的大小。

【讨论】:

  • 这不能正常工作。将 triTable[3] 更改为 triTable[1] 应该返回 3,但仍返回最大 6。
  • @trshmanx 你错了。所有内部数组的大小都是一样的:6。没错。
【解决方案2】:

如上所述,sizeof f 是指针的大小,而不是它指向的对象的大小,同样,使用 STL 容器是一个更好的选择,因为它们具有跟踪大小的大小成员容器。

话虽如此,如果您坚持使用 C 样式数组,解决方案是将其包装在 structclass 中并从那里返回大小,

struct myArray
{
    const int triTable[4][6] = {
        {},
        {0, 8, 3},
        {0, 1, 9},
        {1, 8, 3, 9, 8, 1},
    };

    const int size = std::size(triTable[3]); // size data member

    int arraySize() const{
        return std::size(triTable[3]); // size method
    }

};

int main()
{
    myArray a;
    std::cout << a.size << "\n";
    std::cout << a.arraySize();
}

输出:

6
6

【讨论】:

  • 这不能正常工作。将 triTable[3] 更改为 triTable[1] 应该返回 3,但仍返回最大 6。
  • 你声明triTable[4][6],不管是否初始化,所有行都有6个元素。这就是数组的工作方式。在您的初始化中,所有未初始化的成员都将被隐式初始化为 0。godbolt.org/z/YaYz7hMYT
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2021-05-12
  • 2011-08-15
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多