如何可靠地获得C型阵列的大小?

Fra*_*ank 10 c c++ arrays size

如何可靠地获得C风格数组的大小?通常建议的方法似乎是使用sizeof,但它在foo函数中不起作用,x传入的位置:

#include <iostream>

void foo(int x[]) {
  std::cerr << (sizeof(x) / sizeof(int)); // 2  
}

int main(){
    int x[] = {1,2,3,4,5};
    std::cerr << (sizeof(x) / sizeof(int)); // 5                              
    foo(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的答案建议,sizeof但他们并没有说它(显然?)如果你传递数组不起作用.那么,我是否必须使用哨兵?(我不认为我的foo函数的用户总是可以信任在最后放置一个标记.当然,我可以使用std::vector,但是我没有得到漂亮的速记语法{1,2,3,4,5}.)

Mic*_*urr 15

在C数组中,C中的参数实际上只是指针,所以sizeof()不起作用.您需要将大小作为另一个参数传递或使用哨兵 - 最适合您的设计.

其他一些选择:

其他一些信息:

  • 对于C++,您可能希望让参数使用包装数组的内容来跟踪数组大小并提供以安全方式将数据复制到数组中的方法,而不是传递原始数组指针.像STLSoft的array_proxy模板Boost的boost :: array这样的东西可能会有所帮助.我之前使用过array_proxy模板效果很好.在使用该参数的函数内部,您可以获得std::vector类似的操作,但函数的调用者可以使用简单的C数组.没有复制数组 - array_proxy模板几乎自动地处理数组指针和数组的大小.

  • 在C中用于确定数组中元素数量的宏(当sizeof()可能有帮助时 - 即,你没有处理一个简单的指针):C中是否有一个标准函数可以返回长度一个数组?


Dan*_*nga 5

GNU Libstdc++ 文档中提到的一个常见习语lengthof函数:

template<typename T, unsigned int sz>
inline unsigned int lengthof(T (&)[sz]) { return sz; }
Run Code Online (Sandbox Code Playgroud)

您可以将其用作

int x[] = {1,2,3,4,5};
std::cerr << lengthof(x) << std::endl;
Run Code Online (Sandbox Code Playgroud)

警告:这仅在数组没有衰减为指针时才有效。