在学习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()的更多相关文章

  1. C语言——strlen()和sizeof的区别

    strlen()和sizeof()的区别: strlen()——>C字符串库函数,返回字符串的真实长度.它是从内存某位置开始扫描,直到碰到结束符'\0'停止,返回计数器值. sizeof()—— ...

  2. 函数strlen()和sizeof的区别

    函数strlen()和sizeof的区别: #include<stdio.h> #include<stdlib.h> #include<string.h> #def ...

  3. c strlen和sizeof详解

    用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1: char str2[10] = "hello c"; printf("st ...

  4. 注意字符串的strlen与sizeof的差别

    unsigned char AT_RESET[]="r\r\n"; printf("strlen=%d sizeof=%d\n",strlen(AT_RESET ...

  5. c语言中:strlen和sizeof的区别和它们分别交换各自作用领域(\0问题)时的细微差别!!!

    本人c语言初学菜鸟一枚,今天通过敲了一段简单代码,发现strlen和sizeof之间的一些关系,总结如下: 用strlen计算数组长度要考虑进去\0 用sizeof计算字符串长度也要考虑进去\0 而s ...

  6. 关于strlen和sizeof的使用

    在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...

  7. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

  8. strlen和sizeof的区别

    1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字节大小.   2.sizeof是算符,strlen是函 ...

  9. strlen 与 sizeof 的区别

    void ngx_time_init(void) { ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1 ...

随机推荐

  1. MySQL注入load_file常用路径

    WINDOWS下: c:/boot.ini //查看系统版本 c:/windows/php.ini //php配置信息 c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的M ...

  2. POJ 1961 2406 (KMP,最小循环节,循环周期)

    关于KMP的最短循环节.循环周期,请戳: http://www.cnblogs.com/chenxiwenruo/p/3546457.html (KMP模板,最小循环节) POJ 2406  Powe ...

  3. HDU 1796 How many integers can you find (状态压缩 + 容斥原理)

    题目链接 题意 : 给你N,然后再给M个数,让你找小于N的并且能够整除M里的任意一个数的数有多少,0不算. 思路 :用了容斥原理 : ans = sum{ 整除一个的数 } - sum{ 整除两个的数 ...

  4. light oj 1205 - Palindromic Numbers 数位DP

    思路:搜索的时候是从高位到低位,所以一旦遇到非0数字,也就确定了数的长度,这样就知道回文串的中心点. 代码如下: #include<iostream> #include<cstdio ...

  5. linux查找有用日志常用技巧

    对于高级测试人员来说.需要有快速定位问题的能力,而查看有效的日志就是其中有效的方法之一,然而服务器上的日志多如牛毛,如何快速从中找出所需信息非常重要,以下是我在工作中用到的查找日志的简单命令,希望对大 ...

  6. [转载]Jmeter那点事·ForEach和If控制器

    如果我们要实现一个循环,如果城市是北京,则返回首都:否则,返回城市.   一.新建用户自定义变量 添加-配置元件-用户自定义变量, 定义变量注意命名格式:变量名 加 下划线 加 数字(从1开始计数) ...

  7. 如何向AcmeAir注入问题代码

    为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...

  8. React的CSS

    1.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="U ...

  9. MSChart 控件

    微软发布了.NET 3.5框架下的图表控件,功能很强劲,基本上能想到的图表都可以使用它绘制出来,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式,不过缺点也比较明显 ...

  10. 详解TCP和UDP数据段的首部格式

    TCP数据段的首部格式: 源端口号(16) 目的端口号(16) 序列号(32) 确认应答号(32) 数据偏移(4) 保留(6) 代码位(6) 窗口(16) 校验和(16) 紧急指针 选项(长度可变) ...