首页 > 其他分享 >strlen、length、size、sizeof的应用场景

strlen、length、size、sizeof的应用场景

时间:2024-02-02 12:01:24浏览次数:22  
标签:int char length 数组 长度 sizeof strlen

1、区别

  sizeof() 的值在编译时即计算好了,参数可以是指针、数组、类型、对象、函数等。
  sizeof(指针) = 指针大小。
  sizeof(数组名) = 数组占用总空间。
  sizeof(类型) = 类型字节对齐后占用总空间。
  sizeof(函数) = 函数的返回类型所占的空间大小。函数的返回类型不能是void。
strlen() 是函数,其值在运行时计算, 参数必须是字符型指针(char*),该函数实际完成的功能是从代表 该字符串的第一个地址开始遍历,直到遇到结束符’\0’。
strlen(char*)函数求的是字符串的实际长度,返回的长度大小不包括 ‘\0’。


length() 函数用来获取字符串长度。与strlen()不同的是,length()方法并不需要扫描整个字符串,因为string类会保存字符串的长度。

size() 跟length()函数一样,可以获得字符串长度。但是size()函数还可以用来获取vector的长度。

二、分析
1、sizeof() 和 strlen()
1)sizeof(指针)
sizeof(指针) = 指针大小

char a[] = "abcdef";
char* ptr1 = &a;

int b = 10;
int* ptr2 = &b;

### 每行最后的数字表示运行的结果,下文均采用这种方式,不再另外说明 ###
printf("%d\n",sizeof(ptr1)); 8(x64,若是x86下,指针都是4字节)
printf("%d\n",sizeof(ptr2)); 8

2)sizeof(数组名),strlen(数组名)
sizeof(数组名) = 数组占用总空间。
strlen(char*) = 字符串的实际长度,返回的长度大小不包括 ‘\0’。

对于一个数组,其数组名往往代表其首元素首地址,但是当数组名与 sizeof() 一起使用时,数组名代表整个数组。

i、sizeof(整形数组名):
int arr1[5] = {1,2,3,4,5};
int arr2[6] = {1,2,3,4,5};
int arr3[] = {1,2,3,4,5};

printf("%d\n", sizeof(arr1)); 20
printf("%d\n",sizeof(arr2)); 24
printf("%d\n",sizeof(arr3)); 20

接下来逐个分析:

arr1:int arr1[5] = {1,2,3,4,5};
编译时申请了长度为5的数组,每个元素类型为int(4字节),总大小为20字节。

arr2:int arr1[6] = {1,2,3,4,5};
编译时申请了长度为6的数组,每个元素类型为int(4字节),总大小为24字节。但是在内存中只初始化了前五个元素,第六个值为0,见下图:


arr3:int arr3[] = {1,2,3,4,5};
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。花括号中有 5 个数,所以系统会自动定义数组 a 的长度为 5。因此总大小为20字节。

注意1:
这里需要说明一下arr2的第六个值为什么为0:
1、首先,int a[6] = {1,2,3,4,5,6};为 “完全初始化”,这个好理解,申请多少长度,就对全部赋初值。
2、其次,int a[6] = {1,2,3,4,5};为 “不完全初始化”,即只初始化部分值,在C/C++中,没有初始化的值自动为0(只限于整形数组,字符型数组为’\0’,在下文会讲到)。
3、最后,int a[6];为 “完全不初始化”,这种情况下各个元素的值是不确定的,它们取决于数组所在的内存位置上的原始数据。这可能会导致程序出现一些错误和不可预测的结果。比如下图:


注意2:
这里说明三点语法错误:
1、不能写成 int a[5]={}; 如果大括号中什么都不写,那就是极其严重的语法错误。大括号中最少要写一个数。比如 int a[5]={0};这时就是给数组 “清零”,此时数组中每个元素都是零。
2、如果定义的数组的长度比花括号中所提供的初值的个数少,也是语法错误,如 a[2]={1,2,3,4,5};
3、如果定义数组时不初始化,那么省略数组长度就是语法错误。如 int a[];
————————————————

一、length()函数

c++中,length()只是用来获取字符串的长度。

例如:string str = “asdfghjkl”
则,str.length() = 9。

二、size()函数

c++中,在获取字符串长度时,size()函数与length()函数作用相同。
除此之外,size()函数还可以获取vector类型的长度。

例如:vector < int> num(15,2)
则,num.size() = 15。
例如:string str = "d1da";
则, cout<<str.size();

三、sizeof()运算符

sizeof()运算符用来求对象所占内存空间的大小。

char c[] = "asdsds";
char* cc = c;
char cn[40] = "asdsds";
int a[] = {1,2,3,4,5,6};
int* aa = a;
cout << sizeof(c) << sizeof(cc) << sizeof(cc) << sizeof(cn);
cout << sizeof(a) << sizeof(aa) << sizeof(aa);

结果输出:

sizeof(c) = 7 //c是数组,计算到'\0'位置,结果为6 * 1+1=7
sizeof(cc) = 8 //cc为指针类型,大小为8
sizeof(*cc) = 1 //*cc指向c的第一个字符,大小为1
sizeof(cn) = 40 //开辟40个char空间,大小为40 * 1=40
sizeof(a) = 24 //a是数组,但不需计算到'\0',结果为6 * 4=24
sizeof(aa) = 8 //aa为指针类型,大小为8
sizeof(*aa) = 4 //*aa指向a的第一个数字,大小为4
  • 需要注意的是,如果不使用Vector作为数组进行参数传递,那么在传递数组引用是需要再传递一个数组的大小,否则在函数中无法根据首地址计算出数组大小。

四、CPP、java、python获取数组长度的方法

1、CPP
获取字符数组的大小(只能用于获取字符数组长度)
#include
cout<<strlen(a);

注意:获取字符数组长度时,使用strlen(a)和下面将要介绍的sizeof(a) / sizeof(a[0]) 得到的结果略有差别,sizeof(a) / sizeof(a[0]) 会把char数组的’\0’也算入在内。所以得到的大小会比strlen得到的大一。例如:

char a [] = "dadada";
cout<<sizeof(a) / sizeof(a[0]);      //结果为7
cout<<strlen(a);        //结果为6

万能方法

sizeof(a) / sizeof(a[0]) 或者 sizeof(a) / sizeof(* a)

2、Java
注意,java获取数组长度时,length并不是一个方法

a.length

3、Python

len(a)
 

 

 

参考:https://blog.csdn.net/Chiang11/article/details/132075874?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-132075874-blog-119644082.235^v43^pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=3

标签:int,char,length,数组,长度,sizeof,strlen
From: https://www.cnblogs.com/klb561/p/18002939

相关文章

  • MySQL建索引报错:BLOB/TEXT column used in key specification without a key length
    MySQL建索引报错:BLOB/TEXTcolumnusedinkeyspecificationwithoutakeylength因为text类型的字段值太长,没办法为全部内容建立索引,只能指定前多少位字符建立索引;就像这样createindex`索引名`on表名(字段名(600));所以能用varchar能放下的尽量使用varchar吧......
  • 深入解析C++中sizeof和strlen的奥秘:区别、应用与技巧全揭秘!
     sizeof 和 strlen 是C++中用于处理字符串的两个不同的操作符,它们的作用和使用场景有很大的区别。sizeof操作符:区别:sizeof 是一个运算符,不是一个函数,用于获取一个类型或变量的字节大小。对于数组,sizeof 返回整个数组的字节大小。对于指针,sizeof 返回指针本身的......
  • [转帖]ORA-01450 maximum key length (3215) exceeded
    一、问题背景给一个业务表online建索引时遇到了ORA-01450maximumkeylength(3215)exceeded报错,看字面意思是字段太长了,检查表字段类型发现基本都是nvarchar2(2000),有些字段(例如unit)明显是不需要这么长的,表的设计有问题,联系开发按实际需求改短后能正常创建。奇怪的是表的......
  • 无涯教程-Redis - STRLEN命令函数
    RedisSTRLEN命令用于获取存储在键(key)处的字符串值的长度,当键包含非字符串值时,将返回错误。STRLENkey-返回值整数回复,键处字符串的长度,如果键不存在,则返回0。STRLENkey-语法以下是Redis SETLEN  命令的基本语法。redis127.0.0.1:6379>STRLENKEY_NAMESTRLE......
  • netty: LengthFieldBasedFrameDecoder的用法示例
    一、服务器端启动类:packagecn.edu.tju;importio.netty.bootstrap.ServerBootstrap;importio.netty.buffer.ByteBuf;importio.netty.buffer.Unpooled;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketCh......
  • c zero length array 零长度数组
    structuserdata{uint32_tlen;uint8_tdata[0];};在阅读一些开源代码时,比如linuxkernel,会发现上面这种用法,这种叫做零长度数组。有什么作用呢?简单来说为了开发便利,顺便节省空间。使用限制只能放在结构体结尾,也就是一个结构体只能有一个零长度数组。使用场景比......
  • C练习——计算字符串长度,实现strlen功能
    strlen是一个库函数,是专门求字符串长度的,只能针对字符串,从参数给定地址向后一直找“\0”,统计“\0”之前出现的字符的个数。现给字符串“abcd”,要求写一个计算此字符串长度的函数 #include<stdio.h>intmy_strlen(chararr[]);//函数声明intmain(){chararr[]=......
  • 无涯教程-Java - int length()函数
    此方法返回此字符串的长度。长度等于字符串中16位Unicode字符的数量。intlength()-语法这是此方法的语法-publicintlength()intlength()-返回值此方法返回此对象表示的字符序列的长度。intlength()-示例importjava.io.*;publicclassTest{publicstati......
  • 在使用strlen() 函数判断一个字符串长度后重新开辟一个内存存放时要+ 1
    typedef struct{    char *id;    char *name;    int score1;    int score2;    int score3;} Stu;intmain(){Stu*stutmp=(Stu*)malloc(sizeof(Stu));if(stutmp==NULL){returnNULL;}charidtmp......
  • Golang unsafe.Sizeof 函数代码示例
    在Go语言中,可以使用unsafe.Sizeof()函数来获取变量或类型的大小(以字节为单位)。下面是一个示例代码,演示如何使用unsafe.Sizeof()函数:packagemainimport( "fmt" "unsafe")typePersonstruct{ Namestring Ageint}funcmain(){ varnumint varstrstring......