从一维数组看sizeof和strlen
来源:互联网 发布:南昌网络推广 编辑:程序博客网 时间:2024/06/10 21:46
作者:王姗姗,华清远见嵌入式学院讲师。
前几天学习一维数组的赋值的时候遇到这样一个问题,程序如下:
char a[]="hello";
char b[5]={'h','e','l','l','o'};
char c[]={'h','e','l','l','o','/0'};
char *d="hello";
printf("%d,%d/n",sizeof(a),strlen(a));
printf("%d,%d/n",sizeof(b),strlen(b));
printf("%d,%d/n",sizeof(c),strlen(c));
printf("%d,%d/n",sizeof(d),strlen(d));
运行结果如下:
6,5
5,38
6,5
4,5
在分析结果之前,我们先来看下sizeof和strlen的区别。
本质上而言,sizeof是一个运算符,它用类型作为参数,而strlen只是C库提供的一个函数,他用来计算以’/0’结果的字符串的长度,即它的参数只能是char*。它们相同的地点就只是返回值,都是一个size_t类型的值。
其实还有其他不同的地方,我们来通过这个程序分析下。
1)分析第一行第二行,同样是给数组赋值了hello,为什么结果却不一样。
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,而sizeof的结果是在编译的时候就计算过的,是类型或变量占内存的大小。Strlen是计算以’/0’结束的字符串的长度,故如果b的长度就不是我们所想的我们给它赋值的字符串的长度了。如果你对b进行了如下的赋值:char b[5]={'h','e','l',‘/0’,'l'};那么b的长度也只有3了。
2)sizeof是我们给字符串赋值时系统分配给数组所用空间的值。比较a和c,这个时候我们对它俩的赋值其实是一样的,b区别于c,内存给a、c分配的都是6个字节,而b只分配给5个字节。
3)分析第一行第四行,为什么同样给a、d赋值了一个字符串,用strlen求出的值相同而用sizeof求出的不一样?
原因就是:数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。sizeof(d) 结果 4 ,这个时候,d是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4。而sizeof(a)中a表示的是分配的数组 a 所占的内存空间的大小,不受里面存储的内容改变。
所以通常当我们来计算字符串数组的长度,到底用到的是 sizeof 和 strlen ,是需要考虑的,应注意它们的区别。
- 从一维数组看sizeof和strlen
- 从一维数组看sizeof strlen
- sizeof和strlen(一)
- 一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出
- 一维数组和二维数组的运算(sizeof与strlen的区别)
- 数组的sizeof和strlen
- 数组中的strlen和sizeof
- 关于sizeof和strlen在一维数组的一些运算
- 一维数组 与指针 sizeof strlen int char
- 有关数组的运算:sizeof()和strlen()
- c语言中的数组sizeof和strlen
- 关于数组中的sizeof和strlen
- strlen和sizeof求字符数组长度
- c语言数组遇上sizeof和strlen
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- 数组 strlen sizeof
- sizeof && strlen, 数组 && 指针
- strlen()&sizeof在静态数组和动态数组中的应用~
- VC2005工程常用设置&系统环境变量设置
- 水晶报表程序控制导出
- Hibernate查询
- 二维数组new小结
- ArcEngine创建SDE的workspace,包括FeatureWorkSpace和RasterWorSpaceEx
- 从一维数组看sizeof和strlen
- WinCE Eboot中加入Linux boot的支持
- Android中的Monkey工具
- 在vs2005中添加lib库的方法
- cygwin setup
- 在VC中创建DLL文件的方法步骤
- 针对卡巴斯基2010的免杀研究
- C++ - _T含义 C++语言中“_T”是什么意思?
- wchar_t与char转换