sizeof和strlen的区别

简介: 第一个例子:    char *ss="0123456789";    sizeof(ss)=4, ss是指向字符串常量的字符指针。    sizeof(*ss)=1, *ss是第一个字符。

第一个例子: 

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

目录
相关文章
|
2月前
|
编译器 C语言
sizeof,sizeof与strlen的区别
sizeof,sizeof与strlen的区别
24 0
sizeof,sizeof与strlen的区别
|
10天前
|
C语言
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
sizeof与strlen的使用及其区别
|
2月前
|
存储 编译器
strlen()和sizeof()的区别
strlen()和sizeof()的区别
19 0
|
2月前
strlen与sizeof 的基本用法
strlen与sizeof 的基本用法
26 0
|
12月前
strlen和sizeof详解
strlen和sizeof详解
64 0
|
2月前
|
Serverless
sizeof和strlen的区别【详解】
sizeof和strlen的区别【详解】
39 0
|
7月前
|
C语言
strlen和sizeof的区别
strlen和sizeof的区别
47 0
|
7月前
strlen与sizeof的区别
strlen与sizeof的区别
26 0
|
8月前
sizeof和strlen的对比
sizeof和strlen的对比
27 0
|
10月前
sizeof与strlen区别
sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小 strlen是函数,参数类型必须是字符型指针(char *),用于计算字符串,从字符串的第一个地址开始遍历,直到遇到‘\0’停止
57 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    29
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19