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 ...
随机推荐
- 吊炸天的 PHP 7 ,你值得拥有
2015年的夏天,虽然来得不算火热,但是在互联网技术的夏天,比任何一年都更为火热. 刚刚才结束了 月底的网易.支付宝.携程以及多家云存储厂商的接连故障的坏消息,6月上旬则迎来了编程语言界两大好消息,第 ...
- Razor语法学习
原文:http://www.cnblogs.com/youring2/archive/2011/07/24/2115254.html 1.Razor的文件类型 Razor支持两种文件类型,分别是.cs ...
- 11gR2数据库日志报错:Fatal NI connect error 12170、
11gR2数据库日志报错:Fatal NI connect error 12170.TNS-12535.TNS-00505 [问题点数:100分,结帖人MarkIII] 不显示 ...
- codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
题目 //参考了网上的代码 注意答案可能超过32位 //要达成目标,就是要所有数列a的都比数列b的要小或者等于 //然后,要使最小的要和最大的一样大,就要移动(大-小)步, //要使较小的要和较大的一 ...
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
- poj 3621(最优比率环)
题目链接:http://poj.org/problem?id=3621 思路:之前做过最小比率生成树,也是属于0/1整数划分问题,这次碰到这道最优比率环,很是熟悉,可惜精度没控制好,要不就是wa,要不 ...
- x86虚拟地址到物理地址的映射学习
这里只谈分页管理的机制,也是目前最重要的内存管理机制. 最初的设计想法: 结构图如下: 页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移. 页表项的结构: 各个位的含义 ...
- VS输入法问题
问题描述:启动VS,打开Winform等的界面设计,无法为控件输入中文,另外,运行程序,无法在TextBox等控件中输入中文: 本人的系统环境:Win7旗舰版,VS2008.VS2010和VS2012 ...
- 网络处理2-异步POST请求和同步请求
一.异步POST请求 假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个: username :母鸡 pwd :123 1.POST请求细节 ...
- 【PSR规范专题(4)】PSR-3 日志接口规范
本文转自:https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-3-logger-interface-cn.md 本文制定了日志类库的通用接口规范. ...