Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组大于C+中指定的大小+;_C++_Arrays - Fatal编程技术网

C++ 数组大于C+中指定的大小+;

C++ 数组大于C+中指定的大小+;,c++,arrays,C++,Arrays,测试这样的阵列时: float test [3] = {1, 2, 3}; cout << "Test size: " << sizeof(test) << endl; float test[3]={1,2,3}; cout您必须使用以下方法获得所需数组的实际大小 int size = sizeof(test)/sizeof(test[0]); sizeof()实际上。因此,可以得到数组对象中的字节数。为了得到元素的数量,我们需要把它除以元素的大小。例

测试这样的阵列时:

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

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

cout您必须使用以下方法获得所需数组的实际大小

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

sizeof()
实际上。因此,可以得到数组对象中的字节数。为了得到元素的数量,我们需要把它除以元素的大小。例如,这里
sizeof(float)

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

int sz = sizeof(test) / sizeof(test[0]);
cout << "test size: " << sz << endl;
int sz=sizeof(test)/sizeof(test[0]);
cout这将起作用:

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

size
\t类型保证保存任何数组索引,因此使用
size\t
sizeof
不会返回数组中的元素数,而是返回以字节为单位的内存大小。由于数组包含三个常规整数,且整数的大小为4字节,因此3*4==12字节

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


选择1
int size=sizeof(test)/sizeof(test[0]);
它所做的是得到数组的大小(12字节),然后除以单个元素的大小(4字节)。显然12/4==3


选择2 正如@PaulMcKenzie所指出的,如果你能使用C++17,你就可以使用。这使它变得非常简单,因为您可以这样做:

int size=std::size(测试);

备选方案3(不推荐)
int size=*(&test+1)-测试;

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

如果您想要更有效地计算数组中的元素数,可以使用模板

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

编译器将尝试推断模板参数。要使参数类型与所传递的匹配,T必须是float,size必须是3(使参数引用一个由3个float组成的数组)。

标准库为此提供了一个类型特征

#include <type_traits>
#include <iostream>

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

    std::cout 
        << std::extent<decltype(test)>::value 
        << '\n';
}
#包括
#包括
int main()
{
浮动测试[3]={1,2,3};
标准::cout

sizeof()不返回元素的元素。如果你有C++ 17,使用.<代码> STD::CUT我觉得应该有一个副本在某处,但是我就是找不到它。当然还有其他人也认为 SsieOS/<代码>给出了数组的长度。你应该阅读,这样你就知道格式化的工作原理:PI思考撤销(测试+1)。根据C标准调用未定义的行为(毕竟,该地址中没有浮点数组)通过编译器的优化优化可能会破坏代码,即使常识说应该是好的。避免。@ HydE是C++问题——不清楚代码是UB还是C++。not@M.M哦,是的。但是C++中的这一点真的不同吗?没有标准的HIT,但是我想关于撤销指针的规则是一样的。同一评价<代码>测试+1 <代码>在C++中是有效的,但在C中未定义,如<代码> *(和测试+ 1)< /代码>给出了两种语言中的未定义行为。如果你能详细阐述,那么它会更有效。如果你的C++可能是新的,模板会让新手感到困惑(尤其是像这样的聪明用法),那么它可能更值得解释。基本上,您重新执行了代码> STD::siz()/Cys>。@ JePijHull如果没有C++ 17支持的编译器,那我就不知道这是STD::大小是什么。
#include <type_traits>
#include <iostream>

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

    std::cout 
        << std::extent<decltype(test)>::value 
        << '\n';
}