使用前景:
最近在写代码的时候,对sizeof和strlen的使用感有些模糊,在看了一些讲解之后决定写一篇笔记
首先我们都知道,字符串是以’\0’结束的,char str1[] = “hi”,其实是等价于char str1[] = {‘h’,‘i’,‘\0’}。
先来看一个简单的例子:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello world";
char str1[100] = "hello world";
printf("sizeof(str): %d\n",sizeof(str));
printf("sizeof(str1): %d\n",sizeof(str1));
printf("strlen(str): %d\n",strlen(str));
printf("strlen(str1): %d\n",strlen(str1));
return 0;
}
程序的运行结果如图:
在未定义数组大小时:从运行结果可以得出一些结论,首先在对于同一个字符串sizeof和strlen计算做处理的时候sizeof的值要比strlen的值要多1,这是因为sizeof会把字符’\0’算进去,而strlen计算的是字符串实际的长度,是不包括’\0’的。
在定义了数组大小时:sizeof的结果就是数组的大小,而strlen()的结果就是字符串的实际大小。
还有一个算是有一点偏题的就是:当数组作为形参时,sizeof的结果是什么,现在通过一个例子来看
#include <stdio.h>
#include <string.h>
void getfunc(char *str)
{
printf("sizeof(str):%d\n\n",sizeof(str));
}
int main()
{
char str[] = {};
getfunc(str);
return 0;
}
其打印结果如下:
包括我把数组的类型改成int或者是double,得出来的都是同样的结果,这是因为在主函数中定义的是数组,而在传参的时候,传递的是数组的数组名,而数组名就是该数组的首地址,所以传递的其实是地址,而sizeof(地址)的结果只跟操作系统的位数有关,比如我是64位的操作系统,我打印的sizeof(地址)就是8(一个字节八位)。
下次再见