计算阵列的长度

Ash*_*shu 5 c++ arrays

我有一个C++数组声明如下所述:

CString carray[] =
{
        "A",
        "B",
        "C",
        "D",
        "E"
}
Run Code Online (Sandbox Code Playgroud)

我想确定carray运行时的长度.我在做:

int iLength = sizeof(carray)/sizeof(CString);
Run Code Online (Sandbox Code Playgroud)

它是否正确?

ava*_*kar 24

您可以使用以下功能模板.如果你正在使用Boost,你可以打电话boost::size.

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

int iLength = size(carray);
Run Code Online (Sandbox Code Playgroud)

然而,正如其他人已经说过的那样,你应该更喜欢std::vectorC风格的数组.

  • +1 - 为了说清楚,应该指出这应该在C++中使用的原因(显然它在C中不起作用)是,如果你不小心尝试使用它,它会产生编译时错误指针,而sizeof(ptr)/ sizeof(ptr [0])方法将愉快而无声地给出错误的结果. (3认同)

Tim*_*mbo 17

是.如果声明的元素类型发生变化,您也可以编写

int iLength = sizeof(carray)/sizeof(carray[0]);
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 6

这是正确的,因为它使用元编程:

template <typename T, std::size_t N>
inline std::size_t array_size( T (&)[N] ) {
   return N;
};
Run Code Online (Sandbox Code Playgroud)

你必须知道,当编译器看到数组定义时,这是有效的,但是在它被传递给函数(它衰变成指针的地方)之后就不会这样:

void f( int array[] )
{
   //std::cout << array_size( array ) << std::endl; // fails, at this point array is a pointer
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // fails: sizeof(int*)/sizeof(int)
}
int main()
{
   int array[] = { 1, 2, 3, 4, 5 };
   f( array );
   std::cout << array_size( array ) << std::endl; // 5
   std::cout << sizeof(array)/sizeof(array[0]) << std::endl; // 5 
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 5

这段代码是正确的,但在大多数情况下,有更好的方法来处理C++中的数组.特别是因为此方法不适用于动态大小的数组.

对于这种情况,请使用std::vector表示动态大小数组的标准库类(即,您可以插入和删除条目).

  • 对于静态大小的boost :: array. (2认同)