学习交流|C语言sizeof与strlen的区别与使用

前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。
因为是个人复习,会有部分压缩和省略。
一、sizeof 1.sizeof用来计算类型或变量所占空间的大小,单位为字节。计算时包括 '\0'。('\0'算作字符串的结束标志,在使用strlen计算长度时不被计算进去)
学习交流|C语言sizeof与strlen的区别与使用
文章图片


2.两种特殊情况:sizeof(数组名) 和 &数组名,这两种情况下,数组名代表的是整个数组,其他情况下数组名代表的只是数组首元素地址。
3.sizeof是一个(单目)操作符,不是库函数,这个操作符返回的结果是size_t(unsigned int),即无符号整型。
4.sizeof(),括号中如果放变量,括号可以省略,如果是类型,不可以省略。(函数后的括号不能省略)
学习交流|C语言sizeof与strlen的区别与使用
文章图片


5.C语言标准规定:sizeof(long) >= sizeof(int)
学习交流|C语言sizeof与strlen的区别与使用
文章图片


6.sizeof括号中的表达式不参与计算
学习交流|C语言sizeof与strlen的区别与使用
文章图片

因为sizeof括号中的表达式是不参与运算的! 因为sizeof是在编译期间进行处理的,源文件在变成可执行文件过程中,经过预处理,编译,汇编,链接,sizeof在编译中就判断了c的大小,给出值为4,并且表达式不参与运算,而printf函数是在运行的时候再执行的,所以直接打印出4,和下面s变量的值0。
7.计算数组元素个数时,sizeof陷阱
我们在使用数组和函数时,有时需要用到数组的大小,这时,如果我们是在函数中使用传过来的数组首元素地址来计算整个数组的大小,就容易出现错误。
学习交流|C语言sizeof与strlen的区别与使用
文章图片

用sizeof求数组大小时要注意,当数组被当作参数传递过去时,传过去的是数组的首元素的地址,因为是地址,所以用指针来接收,所以函数里面用sizeof求的都是指针的大小(值为4或8),不是数组的大小,所以求数组元素个数时,会出现指针大小除指针大小的情况,所以在函数中计算得出数组元素个数的值为1
二、字符串操作函数strlen
1.strlen计算字符串长度,不包括'\0'。
学习交流|C语言sizeof与strlen的区别与使用
文章图片


2.strlen比较大小可以用if(strlen("abcde")>strlen("abcdefeo"))。但不要用两个字符串的strlen相减是否大于0来判断
学习交流|C语言sizeof与strlen的区别与使用
文章图片

学习交流|C语言sizeof与strlen的区别与使用
文章图片

这个代码中arr1的长度明显小于arr2,直接比较时的结果是正确的。
但是用两长度相减就容易出现bug,之所以会出现bug是因为strlen的返回值类型为size_t(无符号整型),即使相减小于0,得到的数仍为正整数。
学习交流|C语言sizeof与strlen的区别与使用
文章图片

如果非要减,可以使用强制类型转换来实现
学习交流|C语言sizeof与strlen的区别与使用
文章图片

3.数组未以'\0'结尾时使用strlen出现的问题
因为strlen的结束是'\0',即遇到'\0'就结束。那么当一个数组没有以'\0'结尾时,strlen会继续寻找
'\0',因为是在未知数据中,所以这时strlen计算出的结果会是一个随机值。
学习交流|C语言sizeof与strlen的区别与使用
文章图片


【学习交流|C语言sizeof与strlen的区别与使用】

    推荐阅读