sizeof和strlen的区别

夏雪冬日 2012-12-11

函数 c++ 数据类型 数组

第一个例子: 

  char *ss="0123456789";
   sizeof(ss)=4, ss是指向字符串常量的字符指针
   sizeof(*ss)=1, *ss是第一个字符。
第二个例子:   char ss[]="0123456789";
  
sizeof(ss)=11, ss是数组,计算到“\0”位置,因此是(10+1)。

   sizeof(*ss)=1, *ss是第一个字符。
第三个例子:   char ss[100]="0123456789";
  
sizeof(ss)=100, ss表示在内存中预分配的大小,100*1。
   strlen(ss)=10,它的内部是用一个循环计算字符串的长度,直到“\0”为止。
第四个例子:   int ss[100]="0123456789";
   sizeof(ss)=400,ss表示在内存中的大小,100*4
   strlen(ss)错误strlen的参数只能是char*,且必须是以“\0”结尾的。


对函数实用sizeof,在编译阶段会被函数返回值的类型取代。
如:int f1() { return 0;}
    cout<<sizeof(f1())<<endl;   // f1()返回值为int,因此被认为是int。    为4.

sizeof和strlen有以下区别:
  • sizeof是一个操作符,strlen是库函数。
  • sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0’的字符串作参数。
  • 编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度
  • 数组做sizeof的参数不退化,传递给strlen就退化为指针了。

 

《c++ primer》P115 

 

    char ca[] = {'C' , '+' , '+'};  //not null-terminated  
    cout<<strlen(ca)<<endl;  

 

在这个例题中,ca是一个没有null结束符的字符数组,则计算的结果不可预料。

标准库函数strlen总是假定其参数字符串以null字符结束,当调用标准库函数时,系统将会从实参ca指向的内存空间开始一直搜索结束符,直到恰好遇到null为止。

strlen返回这一段内存空间中总共有多少个字符,无论如何这个数值不可能是正确的。

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

登录 后评论
下一篇
云攻略小攻
2662人浏览
2019-10-11
相关推荐
[面试题]sizeof与strlen的区别
1131人浏览
2014-09-07 10:40:00
strlen和sizeof的区别
451人浏览
2014-05-24 19:12:33
Sizeof与Strlen的区别与联系
385人浏览
2016-11-27 21:03:00
sizeof和strlen的区别
568人浏览
2017-11-27 13:46:00
strlen 与sizeof()的区别
434人浏览
2018-10-31 13:50:41
strlen和sizeof的区别
1164人浏览
2011-08-01 12:04:00
C++面试若干问题
1036人浏览
2013-10-11 21:02:00
替换字符串中的空格
589人浏览
2017-12-06 15:35:00
sizeof 和 strlen;gets 和 %s
909人浏览
2014-08-01 10:28:00
【No.1_sizeof与strlen】
425人浏览
2017-11-18 20:31:00
c++ 面试整理
710人浏览
2017-10-10 14:07:00
2012年C++专家进阶之一
327人浏览
2012-05-15 16:08:00
字符串操作
511人浏览
2018-03-10 20:36:37
0
0
0
267