数组大于指定大小(C++)

  • 本文关键字:C++ 大于 数组 c++ arrays
  • 更新时间 :
  • 英文 :


当测试这样的数组时:

float test [3] = {1, 2, 3};
cout << "Test size: " << sizeof(test) << endl;

打印语句显示的大小为12。类似地,当我将大小设为12时,数组中的元素数量为47。这不是以C++为单位指定数组大小的正确方法吗?

sizeof不返回数组中的元素数,它返回以字节为单位的内存大小。由于数组包含三个常规整数,而整数的大小为 4 个字节,因此为 3 * 4 == 12 个字节。

要获取数组的长度,您有几个选项:

<小时 />

选项 1

int size = sizeof(test) / sizeof(test[0]);

这样做是获取数组的大小(12 字节(,然后将其除以单个元素的大小(4 字节(。显然 12/4 == 3。

<小时 />

选项 2

正如@PaulMcKenzie所指出的,如果你能够使用C++17,你就可以使用std::size。这使得它变得非常容易,因为您可以这样做:

int size = std::size(test);
<小时 />

选项 3(不推荐(

int size = *(&test + 1) - test;

这是一个使用指针的聪明黑客,在这里解释。将导致未定义的行为,并可能中断,具体取决于编译器及其优化。

如果你想要更有效的方法来计算数组中的元素数量,你可以使用模板。

template<typename T, std::size_t Size>
std::size_t GetArrLength(T(&)[Size]) { return Size; }

如果我们这样称呼它:

float test[3] = {1,2,3};
GetArrLength(test);

编译器将尝试推断模板参数。要使参数类型与要传递的内容匹配,T 必须为浮点数,大小必须为 3(使参数成为对 3 个浮点数数组的引用(。

您必须使用以下方法来获取所需的数组的实际大小。

int size = sizeof(test)/sizeof(test[0]);

sizeof()实际上返回 no. 字节数。所以,你得到不。数组对象中的字节数。为了得到真正的否。元素,我们需要将其除以那里元素的大小。例如,这里sizeof(float)

您需要将单个元素大小除以得到数组大小。

int sz = sizeof(test) / sizeof(test[0]);
cout << "test size: " << sz << endl;

这将起作用:

size_t n = sizeof(test)/sizeof(test[0]);

size_t 是保证保存任何数组索引的类型,因此请使用size_t

标准库具有用于此目的的类型特征。

#include <type_traits>
#include <iostream>
int main()
{
float test [3] = {1, 2, 3};
std::cout 
<< std::extent<decltype(test)>::value 
<< 'n';
}

最新更新