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 ...
随机推荐
- MySQL 操作表命令
新建表: create table Itemcats (id int(11) not null auto_increment, primary key (id)) engine=MyISAM auto ...
- Windows 8关机的三个最简单方法
Win8怎么关机?全新的Win8系统给用户一个难题,Win8如何关机?笔者整理了Win8关机的最实用的三个方法,希望能让大家了解Win8关机的具体操作,解决Win8如何关机等问题. 最常规的Win8关 ...
- 在 Java EE 组件中使用 Camel Routes
摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...
- ios 团购分类页面(9宫格)
=-= 命名有些错误,但功能实现,以后注意下命名规范 WJViewGroup.h #import <UIKit/UIKit.h> @interface WJViewGroup : UIVi ...
- GDB调试方法精粹
http://blog.chinaunix.net/uid-26922071-id-3756018.html 一.多线程调试 1. 多线程调试,最重要的几个命令: info threads ...
- Java-马士兵设计模式学习笔记-观察者模式-模拟Awt Button
一.概述 Java 的Awt是 Observer模式,现用Java自己模拟awt中Button的运行机制 二.代码 1.Test.java import java.text.DateFormat; i ...
- onCreateOptionsMenu 和 onPrepareOptionsMenu 的区别
onCreateOptionsMenu 第一次创建时调用 onPrepareOptionsMenu 运行时每次点击菜单按钮时都会调用这个函数,可以动态改变菜单项 public boolean onPr ...
- PHP如何提取img标签属性
extract_attrib是一个提取的图像标签属性的PHP脚本函数,使用正则表达式方法提取. 当你想在HTML的img标签中提取图像数据,这非常有用. 如果你知道如何修改正则表达式,那么同样的功能进 ...
- html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null
html 页面表单如果是disabled,则不能提交到服务器端,request.getParameter得到的将为null 解决方法:使用hidden 利用javascript赋值,传递到后台
- .NET中使用OleDb读取Excel
在.NET中可以用OleDb(Object linking and embeding DataBase)来访问Excel using System; using System.Data; using ...