sizeof与strlen是有着本质的区别,sizeof是求数据类型所占的空间大小,而strlen是求字符串的长度,字符串以/0结尾。区别如下:

(1) sizeof是一个C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度。

(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度

实例1:

printf("char=%d/n",sizeof(char));  //1
printf("char*=%d/n",sizeof(char*)); //4
printf("int=%d/n",sizeof(int)); //4
printf("int*=%d/n",sizeof(int*)); //4
printf("long=%d/n",sizeof(long)); //4
printf("long*=%d/n",sizeof(long*)); //4
printf("double=%d/n",sizeof(double)); //8
printf("double*=%d/n",sizeof(double*)); //4

可以看到,char占1个字节,int占4个字节,long点4个字节,而double占8个字节。但 char*,int*,long*,double*都占4个字节的空间。

这是为什么呢?

在C语言中,char,int,long,double这些基本数据类型的长度是由编译器本身决定的。而char*,int*,long*,double*这些都是指针,回想一下,指针就是地址呀,所以里面放的都是地址,而地址的长度当前是由地址总线的位数决定的,现在的计算机一般都是32位的地址总线,也就占4个字节。

实例2:

char a[]="hello";

char b[]={'h','e','l','l','o'};

strlen(a),strlen(b)的值分别是多少?

前面分析过,strlen是求字符串的长度,字符串有个默认的结束符/0,这个结束符是在定义字符串的时候系统自动加上去的,就像定义数组a一样。数组a定义了一个字符串,数组b定义了一个字符数组。因此,strlen(a)=5,而strlen(b)的长度就不确定的,因为strlen找不到结束符。

下面是网上的一个比较经典的例子,分析一下:

char *c="abcdef";

char d[]="abcdef";

char e[]={'a','b','c','d','e','f'};

printf("%d%d/n",sizeof(c),strlen(c));

printf("%d%d/n",sizeof(d),strlen(d));

printf("%d%d/n",sizeof(e),strlen(e));

输出的结果是:

4 6

7 6

6 14

分析一下:

第一行定义c为一个字符指针变量,指向常量字符串,c里面存放的是字符串的首地址。

第二行定义d为一个字符数组,以字符串的形式给这个字符数组赋值。

第三行定义的也是个字符数组,以单个元素的形式赋值。

当以字符串赋值时,"abcdef",结尾自动加一个"/0".

strlen(c)遇到/0就会结束,求的是字符串的长度,为6.

sizeof(c)求的是类型空间大小,在前面说过,指针型所点的空间大小是4个字节,系统地址总线长度为32位时。

strlen(d)也是一样,字符串赋值,自动添加/0,求字符串的长度当然是6.

sizeof(d)是求这个数组所占空间的大小,即数组所占内存空间的字节数,应该为7.

sizeof(e), 数组e以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节。

strlen(e),去找/0结尾的字符串的长度,由于找不到/0,所以返回的值是一个不确定的值。

C语言中的strlen与sizeof的区别相关推荐

  1. (C语言)C语言中的strlen和sizeof

    小白对于C语言中的字符串和单个字符的结束标志存在疑惑,下面就用strlen这个库函数为大家解除疑惑 #include <stdio.h> #include "string.h&q ...

  2. 实例分析C语言中strlen和sizeof的区别

    C语言文章更新目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分 ...

  3. char[]:strlen和sizeof的区别

    C code: // char[]:strlen和sizeof的区别 #include <stdio.h> #include <string.h> int main(int a ...

  4. c语言gets和getchar区别,C语言中 gets 和 getchar 有什么区别

    C语言中 gets 和 getchar 有什么区别 发布时间:2020-07-22 09:14:29 来源:亿速云 阅读:81 作者:Leah 这期内容当中小编将会给大家带来有关C语言中 gets 和 ...

  5. C语言中fun1()和fun2(void)的区别

    C语言中fun1()和fun2(void)的区别 在一次C语言实训中我发现老师在对无参函数的书写中写成fun2(void)的形式,这引起了我的好奇心,我只知道fun1()和fun2(void)是两个无 ...

  6. 计算机汇编指令mov和mova,汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) ...

  7. c语言strlen用法,如何使用c语言中的strlen()函数

    c语言中strlen()函数的用法是:[strlen(const char *str)].该函数用于计算字符串的长度,直到空结束字符,但不包括结束字符,并返回字符串的长度. 函数介绍: (推荐教程:c ...

  8. strlen 与 sizeof 的区别详解

    写函数的时候,经常要对数组和字符串以及指针进行初始化. strlen 是函数,sizeof 是运算符. strlen 测量的是字符的实际长度.以'\0' 结束. 而sizeof 测量的是字符的分配大小 ...

  9. c语言is int number,C语言中NSInteger,NSNumber以及Int的区别

    NSInteger和NSNumber 首先:NSInteger,NSNumber并没有什么关系,更不要想当然的以为二者还有什么继承关系,甚至还有人问NSInteger是不是NSNumber的子类?答案 ...

最新文章

  1. 配置Linux两节点SSH密钥信任
  2. 《黑客大曝光:移动应用安全揭秘及防护措施》一2.2 攻击与对策
  3. 在Java中键入Safe SQL
  4. 0x08算法设计与分析复习(二):算法设计策略-回溯法2
  5. 【Python】字典dict类型转换为列表list类型
  6. 飞鸽传书人必须对自己守信
  7. 蓝桥杯青少创意编程python组
  8. Jmeter插件-dubbo
  9. Docker安装与简介
  10. ArcGIS 起伏度、坡度、交通便利度数据生成
  11. HBuilderX搭建Vue项目
  12. Magicodes.IE 2.7.0发布
  13. MongoDB(四)——GridFS
  14. 微信文章临时链接变永久链接
  15. 企业中了勒索病毒该怎么办?可以解密吗?
  16. 五千来多字,就为了聊聊HTTP报文,请求响应头,cookie以及HTTPS加密方式
  17. Dolphinscheduler发邮件
  18. vue实现点击星星评分效果
  19. 【大数据之路5-1】数据仓库工具 Hive
  20. VS2008输入中文乱码

热门文章

  1. 细菌大盘点(二) | 葡萄球菌、沙门氏菌、弯曲杆菌
  2. C语言实现的数独解题程序
  3. EL表达式、JSTL标签库、文件上传和下载
  4. python解释型语言的说明
  5. Mybatis分页实现
  6. 微信小程序悬浮球效果
  7. Selenium安装流程
  8. 制造企业有可能自行开发ERP系统吗?
  9. Linux编程signal函数使用
  10. windows该任务映像已损坏或已篡改。(异常来自HRESULT:0x80041321)