关于sizeof、strlen的理解与辨析以及strlen的模拟实现

1. sizeof()

sizeof的作用: 计算变量所占内存内存空间大小,单位是字节。

注意事项:

① 首先要明确的一点是:sizeof不是函数,而是操作符。

② 如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。

③ sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。

④ 操作数是变量时,括号可以省略。(这也变相证明了sizeof不是函数)

⑤ 操作数是表达式时,表达式不计算。

关于表达式不计算的问题,有必要作一定说明。

8ca539ed967a4802babb0f546475aa0a.png

sizeof 在代码进行编译时,就已根据表达式的类型确定了值的大小,而表达式的执行却要在程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运行期间表达式不会再执行。

2. strlen

其函数原型:size_t   strlen   ( const char * str )  ;

注意事项

① 统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数(并不包括\0)

② strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找

//如下代码就会发生越界查找(因为arr1之前与之后空间是未知的)
#include <stdio.h>
int main()
{
 char arr1[3] = {'a', 'b', 'c'};

 printf("%d\n", strlen(arr1));

 return 0;
}  

③strlen是库函数,使用需要包含头文件# include< string.h>

④strlen的返回类型是无符号整型。

⑤strlen的参数类型是char *的指针,即是一个地址。

2.1关于strlen的模拟实现(主函数不再赘述)

 //计数器⽅式
 
int my_strlen(const char * str)
 {
 int count = 0;
 assert(str);
 while(*str)
 {
 count++;
 str++;
 }
 return count;
 }
 
 
//递归方式
 
int my_strlen(const char * str)
 {
 assert(str);
 if(*str == '\0')
 return 0;
 else
 return 1+my_strlen(str+1);
 }
 
 
 //指针-指针的⽅式
 
int my_strlen(char *s)
 {
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
 }

3.关于sizeof与strlen的区别

image-20241024001144432

posted @ 2024-10-24 00:17  白藏crab  阅读(0)  评论(0编辑  收藏  举报