【C++】strlen 和sizeof 的区别(小结)

【C++】strlen 和sizeof 的区别(小结)strlen 和 sizeof 区别一 sizeof 运算符 计算所占的字节大小 sizeof 是运算符 其值在编译时就已经计算好了 参数可以是数组 指针 类型 对象 函数等 它的功能是 获得保证能容纳实现所建立的最大对象的字节大小 由于在编译时计算 因此 sizeof 不能用来返回动态分配的内存空间的大小 实际上 用 sizeof 来返回类型以及静态分配的对象 结构或数组所占的空间 返回值跟对象

strlen和sizeof 区别

一、sizeof 运算符:计算所占的字节大小

sizeof()是运算符,其值在编译时 就已经计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。

具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:

  1. 数组——编译时分配的数组空间大小;
  2. 指针——存储该指针所用的空间大小(在32位机器上是4,64位机器上是8);
  3. 类型——该类型所占的空间大小;
  4. 对象——对象的实际占用空间大小;
  5. 函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
二、strlen函数: 字符串的具体长度即字符个数

它的功能是:返回字符串的长度。
该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’停止。返回的长度大小不包括‘\0’。

总结一下二者的区别

二者的区别主要是以下四点:

  1. sizeof()是运算符,strlen()是库函数
  2. sizeof()在编译时计算好了,strlen()在运行时计算
  3. sizeof()计算出对象使用的最大字节数,strlen()计算字符串的实际长度
  4. sizeof()的参数类型多样化(数组,指针,对象,函数都可以),strlen()的参数必须是字符型指针(传入数组时自动退化为指针)

出一个简单但是很有学问的题

阅读下面代码,写出运算结果。

void Test1() { char p[] = "hello"; cout << "p: " << p << " " << strlen(p) << " " << sizeof(p) << endl; char p1[] = "hello\0"; cout << "p1: " << p1 << " " << strlen(p1) << " " << sizeof(p1) << endl; char p2[] = "hello\\0"; cout << "p2: " << p2 << " " << strlen(p2) << " " << sizeof(p2) << endl; char p3[] = "hello\\\0"; cout << "p3: " << p3 << " " << strlen(p3) << " " << sizeof(p3) << endl; char p4[] = "hel\0lo"; cout << "p4: " << p4 << " " << strlen(p4) << " " << sizeof(p4) << endl; char p5[] = "hel\\0lo"; cout << "p5: " << p5 << " " << strlen(p5) << " " << sizeof(p5) << endl; } 

首先一定要记住:strlen 计算的是字符串的实际长度,遇到\0即停止;sizeof 计算整个字符串所占内存字节数的大小,当然\0也要+1计算;

  1. char p[] = "hello";首先p的结果大家应该不会错吧? p=hello,strlen=5,sizeof=6

字符串hello的最后隐藏着一个\0故sizeof计算所占字节数是6。即strlen(helloA)=5,sizeof(helloA)=6

  1. char p1[] = "hello\0";p1 的结果:p1=hello,strlen=5,sizeof=7

这里\0主动结束了字符串长度的计算,但隐藏的\0仍然有意义;即strlen(helloAA)=5,sizeof(helloAA)=7

  1. char p2[] = "hello\\0";p2 的结果:p2=hello\0,strlen=7,sizeof=8

第一个\转义了紧挨着的\,使得后面0只是一个普通字符,不能与前面/成为整体。即strlen(hello\0A)=7,sizeof(hello\0A)=8

  1. char p3[] = "hello\\\0";p3 的结果:p3=hello\,strlen=6,sizeof=8

第一个\只转义了第二个\,使得第二个\不能再转义后面,所以第三个/与0成为整体并有结束计算的作用。即p3=hello\AA

  1. char p4[] = "hel\0lo";p4 的结果:p4=hel,strlen=3,sizeof=7

strlen碰到\0就停止输出和计算,所以结果是3;但sizeof不会停止而且两个\0都计算,即sizeof计算helAloA

  1. char p5[] = "hel\\0lo";p5 的结果:p5=hel\0lo,strlen=7,sizeof=8

第一个\转义了紧接的\,使得后面0只是普通字符,而sizeof比strlen多计算一个\0。即计算的p5=hel\0loA

以上内容我已经很努力的解析清楚了,希望大家可以有所收获哈~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223373.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:14
下一篇 2026年3月17日 下午2:14


相关推荐

  • sendgrid html text,使用SendGrid发送电子邮件

    sendgrid html text,使用SendGrid发送电子邮件使用 SendGrid 发送电子邮件发布时间 2020 03 0319 16 51 来源 51CTO 阅读 339 作者 mxy00000 栏目 云计算我们继续来看 AzureGlobal 的一些服务 这次来看下 Azure 中可以用来发邮件的服务 Azure 中其实没有明确可以用来发邮件的服务 因为微软本来就有 O365 能做这个事 但是像发送告警邮件这类的操作仍然可以直接借用 Azure 中的内置功能来实现 但是如果是

    2026年3月19日
    2
  • pca算法matlab代码(单因素方差分析原理)

    PCA主成分分析原理分析和Matlab实现方法(三)PCA算法主要用于降维,就是将样本数据从高维空间投影到低维空间中,并尽可能的在低维空间中表示原始数据。PCA的几何意义可简单解释为:0维-PCA:将所有样本信息都投影到一个点,因此无法反应样本之间的差异;要想用一个点来尽可能的表示所有样本数据,则这个点必定是样本的均值。1维-PCA:相当于将所有样本信息向样本均值的直线投影;2维-PCA:将样本的平面分布看作椭圆形分布,求出椭圆形的长短轴方向,然后将样本信息投

    2022年4月15日
    54
  • Claude电脑版 v1.1.381 最新版

    Claude电脑版 v1.1.381 最新版

    2026年3月13日
    1
  • 蓝桥杯知识点汇总:基础知识和常用算法

    蓝桥杯知识点汇总:基础知识和常用算法此系列包含蓝桥杯 软件类 所考察的绝大部分知识点 算法 和写算法题必备的 JAVA 的基础语法 API 对想从 C C 转到 JAVA 组以及初学算法的同学会有帮助

    2026年3月19日
    2
  • 为什么补码是按位取反加一_补码为什么加1

    为什么补码是按位取反加一_补码为什么加1首先,阅读这篇文章的你,肯定是一个在网上已经纠结了很久的读者,因为你查阅了所有你能查到的资料,然后他们都会很耐心的告诉你,补码:就是按位取反,然后加一。准确无误,毫无破绽。但是,你搜遍了所有俯拾即是而且准确无误的答案,却仍然选择来看这篇毫不起眼的文章,原因只有一个,只因为你还没有得到你想要的东西。            因为你想要的,不是1+1=2,而是,1+1为什么等于2。当然,我们不讨论

    2022年8月15日
    7
  • 【Android Tricks 6】ViewPager首页与尾页的滑动动作响应[通俗易懂]

    【Android Tricks 6】ViewPager首页与尾页的滑动动作响应

    2022年1月28日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号