C/C++ 数组作为参数传递到函数后,使用 sizeof 产生的问题
【摘要】 🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
有时候需要使用 sizeof(g)/sizeof(g[0]) 计算数组的长度(假设有数组 g)。这里先解释下为什么这样计算:
sizeof(g) : 整个数组占用的字节数;
sizeof(g[0]) : g[0] 占用的字节数;
所以 sizeof(g)/sizeof(g[0]) 为数组长度,但是有时候这样计算会出错,例如下面这种情况:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
void func(char s[], int n){
cout<<"----------------- func -------------------"<<endl;
cout<<"sizeof(s) = "<<sizeof(s)<<endl;
cout<<"sizeof(s[0]) = "<<sizeof(s[0])<<endl;
cout<<"The length of s is "<<sizeof(s)/sizeof(s[0])<<endl;
cout<<"----------------- pointer -------------------"<<endl;
char *p = NULL;
cout<<"sizeof(p) = "<<sizeof(p)<<endl;
}
int main()
{
cout<<"----------------- main -------------------"<<endl;
char g[] = {'a', 'b', 'c', 'd', 'e'};
cout<<"sizeof(g) = "<<sizeof(g)<<endl;
cout<<"sizeof(g[0]) = "<<sizeof(g[0])<<endl;
cout<<"The length of g is "<<sizeof(g)/sizeof(g[0])<<endl;
func(g, 3);
return 0;
}
输出结果:
----------------- main -------------------
sizeof(g) = 5
sizeof(g[0]) = 1
The length of g is 5
----------------- func -------------------
sizeof(s) = 4
sizeof(s[0]) = 1
The length of s is 4
----------------- pointer -------------------
sizeof(p) = 4
在上面的输出中,第一部分 main 输出的信息符合预期。但是,将数组 g 作为参数传递到函数 func 时,再做同样的计算,结果就不一样了,为什么呢?
因为数组作为函数参数传递后,会退化为指针,所以计算 sizeof(s) = 4 ,实质等价于计算 sizeof(char *s) 的大小,指针变量大小为 4 字节(在 32 位平台上)。sizeof(s[0]) 计算的是第一个字符的字节大小,即为 1。我们可以看到指针变量 p 计算大小后也为 4。
所以在将数组作为参数传递到函数时,注意 sizeof() 的使用,最好的方式是一同传递一个数组元素个数的变量,比如上面例子中的 n。
CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
欢迎小伙伴们点赞👍、收藏⭐、留言💬
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)