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 ...
随机推荐
- sql盲注及其相关方法
Sql注入过程数据(后台数据不能回显到页面)不回显采用方法 1:构造逻辑判断 ▲left(database(),1)>’s’ //left()函数 ▲and ascii( ...
- List Comprehensions
看Python高级编程时有几个东西要记一记,方便以后查询 以下代码基本全摘自Python高级编程 取0~9之间的偶数,类C语言写法: 使用list comprehensions可以极大程度上简化语法: ...
- 【五】PHP数组操作函数
1.输出数组的结构:bool print_r(数组); $arr=array('jack','mike','tom'); print_r($arr);//Array ( [0] => jack ...
- ECMAScript 5.1中对属性的操作
此操作只针对新版本浏览器. Object.defineProperty(obj,'name',{configurable:true/false,enumberable:true/false,value ...
- Python中编码问题?
一.键盘输入 raw_input('请输入:'.decode('utf-8').encode('gbk'))raw_input(unicode('请输入:','utf-8').encode('gbk' ...
- 在线API文档
http://www.ostools.net/apidocs A Ace akka2.0.2 Android Ant Apache CXF Apache HTTP服务器 ASM字节码操作 AutoCo ...
- ZOJ2928 Mathematical contest in modeling(模拟退火)
连续两天学了一些numerical analysis的方法,昨天是学了一下三分,今天学了一下模拟退火.很早就听说了模拟退火在求费马点上的运用了,只知道一些大概,但是没有深入研究,碰到题目就卡壳了,现在 ...
- 树莓派/RaspberryPi 内核编译
1.获取所需源码 1)下载地址: 官方网址:https://github.com/raspberrypi 上面列出了树莓派所有的开源软件: linux:内核源码 tools:编译内核和其他源码所需的工 ...
- 由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)
是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其 ...
- hdu 1536 S-Nim
题意:首先输入K 表示一个集合的大小 之后输入集合 表示对于这对石子只能去除这个集合中的元素的 个数 之后输入一个m表示接下来对于这个集合要进行m次询问 之后m行 每行输入一个n 表示有 n个堆 ...