首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何可靠地获取C风格数组的大小?

如何可靠地获取C风格数组的大小?
EN

Stack Overflow用户
提问于 2010-03-09 04:40:58
回答 9查看 8.8K关注 0票数 11

如何可靠地获得C样式数组的大小?通常推荐的方法似乎是使用sizeof,但它在传入xfoo函数中不起作用:

代码语言:javascript
复制
#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;
}

this question的回答推荐sizeof,但他们并没有这么说(显然是这样?)如果您传递数组,则不起作用。那么,我是不是必须使用一个前哨呢?(我不认为我的foo函数的用户总是可以相信他们会在末尾放置一个标记。当然,我可以使用std::vector,但这样我就得不到很好的简写语法{1,2,3,4,5}了。)

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-03-09 04:44:49

在C数组中,C中的参数实际上只是指针,因此sizeof()无法工作。您要么需要将size作为另一个参数传递,要么使用一个前哨--以最适合您的设计为准。

其他一些选项:

其他一些信息:

对于

  • C++,您可能希望让参数使用将数组包装在跟踪数组大小并提供以安全方式将数据复制到数组中的方法的类模板中,而不是传递原始数组指针。像STLSoft's array_proxy templateBoost's boost::array这样的东西可能会有所帮助。我以前使用过array_proxy模板,效果很好。在使用参数的函数内部,您可以获得类似std::vector的操作,但是函数的调用者可以使用一个简单的C数组。不需要复制数组-sizeof模板负责将数组指针和数组大小打包在C中用于确定数组中元素数量的automatically.
  • a宏中(因为当sizeof()可能有帮助时-例如,您正在处理的不是简单的指针):Is there a standard function in C that would return the length of an array?
票数 16
EN

Stack Overflow用户

发布于 2010-03-09 04:59:59

GNU Libstdc++文档中提到的一个函数是lengthof函数:

代码语言:javascript
复制
template<typename T, unsigned int sz>
inline unsigned int lengthof(T (&)[sz]) { return sz; }

您可以将其用作

代码语言:javascript
复制
int x[] = {1,2,3,4,5};
std::cerr << lengthof(x) << std::endl;

警告:仅当阵列没有decayed into a pointer时,这才起作用。

票数 5
EN

Stack Overflow用户

发布于 2010-03-09 04:46:19

您可以传递大小,使用前哨,甚至更好地使用std::vector。尽管std::vector没有初始化器列表,但仍然可以很容易地用一组元素构造一个向量(尽管不是很好)

代码语言:javascript
复制
static const int arr[] = {1,2,3,4,5};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) );

vector类也使得犯错误变得更加困难,这是有价值的。另一个好处是所有的C++都应该熟悉它,并且大多数C++应用程序都应该使用std::vector而不是原始的C数组。

作为快速说明,C++0x添加了Initializer lists

代码语言:javascript
复制
std::vector<int> v = {1, 2, 3, 4};

您也可以使用Boost.Assign来做同样的事情,尽管语法有点复杂。

代码语言:javascript
复制
std::vector<int> v = boost::assign::list_of(1)(2)(3)(4);

代码语言:javascript
复制
std::vector<int> v;
v += 1, 2, 3, 4;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2404567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档