C/C++ 计算数组长度及注意事项

Mr. 假老练 2019-04-27 07:57:24
sizeof(数组名)/sizeof(数组元素类型) 因为sizeof是用来计算类型或对象的占用的内存字节数,所以对于自定义的结构体数组依然适用。 原理:sizeof 求出数组所占的字节数,再除以每个元素所占的字节数,自然得到数组的长度。 缺点:①只适用于定义时就初始化好了的数组 如:int num[] = {1,2,3,4,5,6,7,8,9} ②若数组定义时给出的长度和实际赋值的元素个数不相等时,用此方法算出的数组长度就是定义时给出的长度 如:int num[10]; 结果:10 不灵活 ③若将数组名作为实参传递给函数,函数中的数组变成了一个指针,函数中用sizeof(数组名)得到的是一个指针的长度。 如: int getmax(int num[]){ int len = sizeof(num); } 此时的len为8,即在64位处理器环境下,整型指针占用字节数为8 解决方案: 针对缺点②: 建议写一个专门用来求数组长度的方法,作为API int length(int num[]) { int len,i; while(num[i++]!='\0'){ len++; } return len; } 针对缺点③: 建议在调用方法之前将数组长度获得,再将数组长度作为参数传入函数内使用。 如果错误,欢迎批评指正
...全文
792 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-04-30
  • 打赏
  • 举报
回复
记录数组大小是程序员的责任,而不是编译器或加载器的责任。
tongshou 2019-04-29
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
引用
建议写一个专门用来求数组长度的方法,作为API
int length(int num[]) {
int len,i;
while(num[i++]!='\0'){
len++;
}
return len;
}

这个做法是不可取的
这要求你的数组是0元素结尾才有效果 比如 对于你前面的例子 int num[10]; 如果这是局部数组 num里面是10个垃圾值 你的函数返回结果和数组大小没什么关系了

而int数组很少有0元素结尾这样的限制 因为很多时候 int数组中 0 本身作为一个有效数据
这样的情况 你的计算就错了

而且是没有效率的设计。
如果确定不可以用sizeof()的,必须用另外变量或参数给,如果不允许,可以使用数组第一个元素的值记录数组总元素个数。




lin5161678 2019-04-29
  • 打赏
  • 举报
回复
引用
建议写一个专门用来求数组长度的方法,作为API int length(int num[]) { int len,i; while(num[i++]!='\0'){ len++; } return len; }
这个做法是不可取的 这要求你的数组是0元素结尾才有效果 比如 对于你前面的例子 int num[10]; 如果这是局部数组 num里面是10个垃圾值 你的函数返回结果和数组大小没什么关系了 而int数组很少有0元素结尾这样的限制 因为很多时候 int数组中 0 本身作为一个有效数据 这样的情况 你的计算就错了
轻箬笠 2019-04-29
  • 打赏
  • 举报
回复
好像有个宏定义ARRAYSIZE(a),就是这么求数组长度的。
另外,数组传参,好像都是要传入长度数据的吧。至少微软的API传参的时候,都是一个指针+指针指向的内存的长度。
greex 2019-04-29
  • 打赏
  • 举报
回复
为什么不用vertor,list,map呢
真相重于对错 2019-04-28
  • 打赏
  • 举报
回复
template<typename T,int N>
void func( T (&var)[N])
{
	cout<<N<<endl;
}
int main()
{
	int a[10];
	func(a);
    return 0;
}
真相重于对错 2019-04-28
  • 打赏
  • 举报
回复
template<typename T>
void func( T& var)
{
	size_t size=sizeof(var)/sizeof(var[0]);
}
int main()
{
	int a[10];
	func(a);
    return 0;
}
636f6c696e 2019-04-28
  • 打赏
  • 举报
回复
针对缺点②的方案里:如果\0是终结符可以直接使用strlen计算,不用那么麻烦。 在C/C++语言中,作为函数入参时,数组长度都是要传入的。
stherix 2019-04-28
  • 打赏
  • 举报
回复
差不多 但是解决方案:针对缺点② 一般不会这么用 因为数字0也可能是合法的元素,只有针对sz字符串才会使用这种方式 传递给函数的参数如果有数组,最好还是把长度也传递进去 或者采用std::vector等容器

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧