C语言中的sizeof与strlen

简介: sizeof和strlen函数基本在所有公司的嵌入式软件笔试题中都会出现。反正我是遇到了好几次。虽然很多人都会用,但是又很经常会出错,这是因为很多人没有好好的去总结。好了,废话不多说,进入今天的主题。

前言

sizeof和strlen函数基本在所有公司的嵌入式软件笔试题中都会出现。反正我是遇到了好几次。虽然很多人都会用,但是又很经常会出错,这是因为很多人没有好好的去总结。好了,废话不多说,进入今天的主题。

sizeof

sizeof()用来判断数据类型长度或数组长度。

数据类型

sizeof(char) //1
sizeof(short)//2  
sizeof(int)  //4  
sizeof(long) //8

上面的参数直接给类型,返回的结果是操作系统对对应的类型分配的字节大小。简单说就是char类型的变量会分配1个字节,这些是根据具体的操作系统而言的,不同操作系统,不同编译器,分配的字节大小会有一点差异。

普通变量

char a;
sizeof(a); //1
int b;
sizeof(b); //4或2 跟具体编译器有关

上面使用普通变量和使用类型作为参数类似,都是根据变量的类型来判断具体的字节大小。

数值

sizeof(8); //4或2 ,在C语言数值8默认为int类型
sizeof(8.8);//8 , 8.8默认为double类型

基本上我们可以把上面三种情况当成同一类,其实都是根据类型来判断大小。

数组

//一维数组
int a[10];
sizeof(a); //40  总存储空间大小:4*10
sizeof(a[1]) //4 
sizeof(&a)  //4
sizeof(&a[0]) //4

//二维数组
int b[2][3]={
            {1,2,3},
            {4,5,6}
           };
sizeof(b); //24 计算: 2*3*4 = 24
sizeof(b[0]) // 12 , 计算3*4 = 12
sizeof(b[0][1]) //4
sizeof(&b) //4

直接使用数组名就是计算整个数组占用的存储空间,然后我们具体说一下一维数组的后三个。第一个a[1]和普通变量时一样,所以也是根据类型来计算大小,所以int为4;第二个&a代表一个地址(它是数组名a的地址),而地址的大小都是4,无论什么类型变量的地址都是4(当然这个跟操作系统有关啦);第三个&a[0]也是地址,所以,你懂得!

字符串

char str[100] = "0123456789";
sizeof(str); //100  计算: 1*100
sizeof(str[0]) // 1
sizeof(&str)  //4

char a[]="abc";
sizeof(a); //4 ,默认字符串会在末尾加上'\0'

char p[]="a\0";
sizeof(p)  // 2

上面的字符串我只是指字符数组,字符串当然还可以是指针,因为我把指针独立出来,所以这里指字符数组。

    首先,当我们指定了字符数组的大小时,则sizeof()的计算结果就是字符数组的大小。它的计算方式和其他类型的数组的方式一样。
    然后就是不指定大小时,它是根据字符数量来自动分配数组大小的。要注意的是:当我们没有在字符串的末尾加'\0',会自动添加'\0'。所以上面的字符串长度才会是4.。

指针

int *p; 
char * str;
sizeof(p); //4 ,这里就是返回指针的大小,因为指针存储的是地址
sizeof(str); //4

sizeof(*p); //4
sizeof(*str); //1

char* str1 = "12345";
sizeof(str1); //4
sizeof(*str1); //1, 第一个字符的大小

因为指针存放的是地址,所以无论是哪种类型的指针使用sizeof()返回都是4,地址的大小就是4 。当我们使用' * ' 运算符去获取指针的值时,然后使用sizeof()时就和sizeof(数值)是一样的了。
额,好像发现没办法获取字符串的长度了。

strlen

ok,上面我们不是发现指针没办法使用sizeof来获取字符串的长度吗?主角要上场了!
strlen: 计算给定字符串的长度,不包括'\0'在内。
原型:unsigned int strlen(char *s);
参数只能是char 类型,如果传int 会有问题。

char a[100] = "0123456789";
strlen(a); //结果是10
sizeof(ss); //结果是100

char *str1 = "11223344556677889900";
strlen(str1); //20
sizeof(str1); //4
strlen遇到'\0'就结束,并且不包括'\0'字符。
相关文章
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
5月前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
30 1
|
5月前
|
C语言
C 语言关于sizeof() 和 strlen()区别?
C 语言关于sizeof() 和 strlen()区别?
35 2
|
5月前
|
C语言
深入探索C语言中的sizeof关键字
深入探索C语言中的sizeof关键字
|
5月前
|
C语言
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现
|
5月前
|
编译器 C语言
【C语言】:sizeof操作符的使用和各种常见数据类型的大小
【C语言】:sizeof操作符的使用和各种常见数据类型的大小
86 0
|
6月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
45 1
|
5月前
|
C语言
C语言——oj刷题——模拟实现库函数strlen
C语言——oj刷题——模拟实现库函数strlen
38 0
|
6月前
|
C语言
C语言(8)----长度计算方法:sizeof与strlen的对比
C语言(8)----长度计算方法:sizeof与strlen的对比
38 0
|
6月前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
26 0