关于sizeof、strlen的理解与辨析以及strlen的模拟实现
1. sizeof()
sizeof的作用: 计算变量所占内存内存空间大小,单位是字节。
注意事项:
① 首先要明确的一点是:sizeof不是函数,而是操作符。
② 如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
③ sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
④ 操作数是变量时,括号可以省略。(这也变相证明了sizeof不是函数)
⑤ 操作数是表达式时,表达式不计算。
关于表达式不计算的问题,有必要作一定说明。
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的区别