C++ 使用sizeof()计算数组大小

C++ 使用sizeof()计算数组大小,c++,arrays,sizeof,C++,Arrays,Sizeof,摘自TopCoder: 表达式sizeofdata/sizeofdata[0]返回数组数据的大小,但只在少数情况下使用,因此除了在这种构造中,不要在任何地方使用它。C程序员会同意我的 为了获得数组大小,我一直在为所有基元类型使用这个表达式sizeofdata/sizeofdata[0] 有人知道不应该使用上述表达式的任何此类情况吗 如果数据是这样声明的: int *data; data = malloc( NUM_ELEMENTS * sizeof(int) ); 然后按如下方式分配空间:

摘自TopCoder:

表达式sizeofdata/sizeofdata[0]返回数组数据的大小,但只在少数情况下使用,因此除了在这种构造中,不要在任何地方使用它。C程序员会同意我的

为了获得数组大小,我一直在为所有基元类型使用这个表达式sizeofdata/sizeofdata[0]

有人知道不应该使用上述表达式的任何此类情况吗

如果数据是这样声明的:

int *data;
data = malloc( NUM_ELEMENTS * sizeof(int) );
然后按如下方式分配空间:

int *data;
data = malloc( NUM_ELEMENTS * sizeof(int) );
那么您的技术将不起作用,因为sizeofdata是指针的大小,而不是数组的内容。

如果数据是这样声明的:

int *data;
data = malloc( NUM_ELEMENTS * sizeof(int) );
然后按如下方式分配空间:

int *data;
data = malloc( NUM_ELEMENTS * sizeof(int) );
那么您的技术将不起作用,因为sizeofdata是指针的大小,而不是数组的内容。

sizeof方法可以编译,但在为其指定指针或大小不确定的数组时不起作用。只需使用适当的C++方法:

template <typename T, std::size_t N>
constexpr std::size_t size(T(&)[N]) {
    return N;
}
在阵列上使用大小可以正常工作。在不适用的情况下使用它将是一个编译时错误,例如在指针上。

sizeof方法可以编译,但在给它一个指针或大小不确定的数组时不起作用。只需使用适当的C++方法:

template <typename T, std::size_t N>
constexpr std::size_t size(T(&)[N]) {
    return N;
}

在阵列上使用大小可以正常工作。在不适用的情况下使用它将是编译时错误,例如在指针上。

对于静态数组的sizeof技术工作校正,它不会有任何问题。如上所述,对于动态数组和指针数据,它将无法正常工作。

对于静态数组,技术工作校正的大小将不会有任何问题。正如上面提到的动态数组和指针数据,它将不能正常工作。

使用STD::vector或STD::Orrar,并且不关心什么时候不能工作。是的,我在C++中使用它们。但是很多时候,我也用C语言编写代码,在这里我使用这个表达式。这个问题是否具体?我认为这不是因为作者为什么做了这个毯子评估。“MikelF从修订历史中看到:C++看起来像C,但是C++,这个问题是关于C++的。将它转换成C问题也会失效。使用STD::vector或STD::Aldand,你不关心什么时候不能工作。是的,我用C++来使用。但是很多时候,我也用C语言编写代码,在这里我使用这个表达式。这个问题是否具体?我认为这不是因为作者为什么做了这个毯子评估。“MikelF从修订历史中看到:C++看起来像C,但是C++,这个问题是关于C++的。将其转换为C问题也会失效,甚至更容易,因为C++11 std::extent::valueThank。。这个表达式称为T&[N]即括号内的&作为参数是什么?第一次看到它。我应该用谷歌搜索哪个词,有什么提示吗?@SebTu:不知何故,我认为Sizerray表达的意思更清楚,而且比std::extent::value更容易键入。@SauraSaha:这只是对数组类型的引用。数组类型为T[N]。简单地写T[N]&是非法的,而T&[N]将是一个引用数组,这也是非法的。基本上,引用或指针指向名称所在的位置,但它需要适当的括号来消除含义的歧义。因此T&[N]。如果它有一个函数不需要的名称,那么它将是t&array[N]。@SauravSahu看一下。帮了我很多次。尤其不要忘记考虑第三条规则:3。总是先解决括号中的任何问题!或者更简单,因为c++11 std::extent::ValueThank。。这个表达式称为T&[N]即括号内的&作为参数是什么?第一次看到它。我应该用谷歌搜索哪个词,有什么提示吗?@SebTu:不知何故,我认为Sizerray表达的意思更清楚,而且比std::extent::value更容易键入。@SauraSaha:这只是对数组类型的引用。数组类型为T[N]。简单地写T[N]&是非法的,而T&[N]将是一个引用数组,这也是非法的。基本上,引用或指针指向名称所在的位置,但它需要适当的括号来消除含义的歧义。因此T&[N]。如果它有一个函数不需要的名称,那么它将是t&array[N]。@SauravSahu看一下。帮了我很多次。尤其不要忘记考虑第三条规则:3。总是先解决括号中的任何问题!