前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sizeof和strlen的区别

sizeof和strlen的区别

作者头像
猿人谷
发布2018-01-17 10:01:21
8650
发布2018-01-17 10:01:21
举报
文章被收录于专栏:猿人谷猿人谷

第一个例子: 

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 

代码语言:javascript
复制
    char ca[] = {'C' , '+' , '+'};  //not null-terminated  
    cout<<strlen(ca)<<endl;  

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-12-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档