Strlen()与sizeof()
在学习C语言时以及面试中,经常会见到strlen()与sizeof()这一对容易混淆的概念,搞清楚这两个概念,往往考察了编程人员对语言的基本掌握能力。
首先大家先明确两个概念是:
1.strlen()是函数,而sizeof()是表面看起来像函数的关键字。
2.Strlen()求得是长度,针对的对象是字符串,而sizeof()求的是大小针对的是类型
之所以二者经常混淆,那是由于在使用过程中未能正确区分哪个是求长度,哪个是求大小,下面就具体讲解sizeof()与strlen()在各种情况下的长度与大小。
情况1:
void main()
{
char str[]=”hello C”;
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=7
sizeof()=8
由于在用字符初始化数组时,系统会在字符串末尾自动加上一个’\0’作为字符的结束标记,因此用sizeof()求出的长度就比strlen()有效长度大1。
情况2:
void main()
{
char str[10]=”hello C”;
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
执行结果:strlen()=7
sizeof()=10
数组名str代表了整个空间的大小,因此sizeof()为10。
情况3:
void main()
{
char str[]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=11
sizeof()=7
由于在初始化str时没有\0,所以strlen()为随机值,而大小就为字符初始化后所占空间的个数。
情况4:
void main()
{
char str[10]={‘h’,’e’,’l’,’l’,’o’,’ ‘,’C’};
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=7
sizeof()=10
由于str未完全初始化,数组剩下的位置用0来填充(‘\0’就是字符0的转意,即0),所以不难看理解str后面的0相当于’\0’,所以strlen(str)的长度为7,而sizeof(str)为数组空间的大小。
情况5与情况6:
void main()
{
char str[10];
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=15
sizeof()=10
sizeof()为数组的大小为10,这毫无疑问,但此时strlen()为随机值。
char str[10];
void main()
{
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=0
sizeof()=10
当把数组变为全局的时,strlen()则变为0,原因是全局变量生成在静态常量区,初始值为0,而情况5中str数组是局部变量,局部变量生成在栈区,初始值为随机值。
情况7:
void main()
{
char *str=”hello C”;
printf(“strlen()=%d\n”,strlen(str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果:strlen()=7
sizeof()=4
由于sizeof()求的是类型的大小而str的类型是指针,因此在32位系统下sizeof()=4;同样的无论是数组指针,函数指针,只要是指针它的sizeof()都等于4。
情况8:
void main()
{
char *str[3]={”hello C”,”abcd”,”xyz”};
//printf(“strlen()=%d\n”,strlen(*str));
printf(“sizeof()=%d\n”,sizeof(str));
}
运行结果: sizeof()=12 strlen(*str)=7//无法求str的有效长度,但是可以求*str的有效长度,即首元素的有效长度
str为指针数组,里面包含了三个指针,所以32它的大小为三个指针类型的大小,即它的sizeof()在32位系统下为3*4=12;
情况9:
当函数用数组做参数时,数组会退化为指针。
以上的九种情况是笔试题中常考的几种类型,相信只要掌握好了,以后遇上这类型题也就迎刃而解了。
Strlen()与sizeof()的更多相关文章
- C语言——strlen()和sizeof的区别
strlen()和sizeof()的区别: strlen()——>C字符串库函数,返回字符串的真实长度.它是从内存某位置开始扫描,直到碰到结束符'\0'停止,返回计数器值. sizeof()—— ...
- 函数strlen()和sizeof的区别
函数strlen()和sizeof的区别: #include<stdio.h> #include<stdlib.h> #include<string.h> #def ...
- c strlen和sizeof详解
用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1: char str2[10] = "hello c"; printf("st ...
- 注意字符串的strlen与sizeof的差别
unsigned char AT_RESET[]="r\r\n"; printf("strlen=%d sizeof=%d\n",strlen(AT_RESET ...
- c语言中:strlen和sizeof的区别和它们分别交换各自作用领域(\0问题)时的细微差别!!!
本人c语言初学菜鸟一枚,今天通过敲了一段简单代码,发现strlen和sizeof之间的一些关系,总结如下: 用strlen计算数组长度要考虑进去\0 用sizeof计算字符串长度也要考虑进去\0 而s ...
- 关于strlen和sizeof的使用
在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...
- strlen()和sizeof()求数组长度
在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...
- strlen和sizeof的区别
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字节大小. 2.sizeof是算符,strlen是函 ...
- strlen 与 sizeof 的区别
void ngx_time_init(void) { ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1 ...
随机推荐
- Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)
第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...
- Spring mvc json null
http://blog.csdn.net/zdsdiablo/article/details/9429263
- poj 3072(最短路)
题目链接:http://poj.org/problem?id=3072 一涉及稍微计算几何方面的东西就要做好久,一开始先用SPFA写的,可能是由于松弛次数过多导致精度损失,郁闷了好久,然后改成Dijk ...
- API 版本控制
http://www.oschina.net/translate/introduction-to-web-api-versioning
- iis 重启 (三种方法)
iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...
- hdu2023 求平均成绩 ~~很闲~~~
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #in ...
- TestDirector安装配置
一.介绍 TestDirector是全球最大的软件测试工具提供商,公司生产企业级测试管理工具,也是业界第一个基于Web的测试管理系统,它可以在公司内部或外部进行全球范围内测试的管理.通过在一个整体的应 ...
- qt之esc键
Esc键对大家来说实在熟悉不过的了,在Qt中Esc键也会默认的进行一些事件的触发,今天对Esc键测试了一下,突然发现不像我想象的那样,在QDialog中按下Esc键会默认调用reject()方法而不是 ...
- MFC的GUI窗口使用Console输出函数printf(AllocConsole后,使用GetStdHandle取得句柄,然后就可以操作了)
在GUI程序中使用printf函数: #include <io.h> #include <fcntl.h> void InitConsole() { int nRet= 0; ...
- Mysql笔记——DQL
DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端. 语法: SELECTselection_list /*要查询的列名称*/ FROM table_lis ...