先说结论:

区别一:
  • sizeof是用来求变量/类型在内存中所占的空间大小,关注的是空间,单位是字节。
  • strlen求的是字符串长度,关注的是字符中有效的字符,单位是有效字符的个数。
区别二:
  • sizeof是操作符,只有在运算对象为类型的时候,才必须带圆括号,其他时候,圆括号可有可无。如sizeof(int)时,必须带括号,sizeof ‘a' 时,括号可有可无。
  • strlen是库函数。是函数,使用时后面的圆括号就必不可少。

接下来,我们通过解读一段代码,来更进一步的分析。

代码:

#include <stdio.h>
#include <string.h>

int main()
{
	char arr_1[] = { '1','2','3'};
	char arr_2[] = "123";

	printf("sizeof(arr_1) = %zu\n", sizeof (arr_1));
	printf("strlen(arr_1) = %zu\n", strlen(arr_1));

	printf("sizeof arr_2  = %zu\n", sizeof arr_2);
	printf("strlen(arr_2) = %zu\n", strlen(arr_2));

	return 0;
}

运行结果:

【strlen】和【sizeof】的区别_有效字符

分析代码:

1.
char arr_1[] = { '1','2','3'};

printf("sizeof(arr_1) = %zu\n", sizeof (arr_1));

sizeof强调的是空间 ,arr_1数组中,存放了3个元素,每个元素的类型是char

,所以结果就是 3 * 1 == 3


2.
char arr_1[] = { '1','2','3'};

printf("strlen(arr_1) = %zu\n", strlen(arr_1));

strlen强度的是字符串中有效字符的长度。那么它如何判断有效字符呢?

strlen从实参出发,一直读取,直到遇见'\0'为止 ,'\0'之前有几个字符,它就返回几。而在arr_1中,没有'\0',所以它会一直往后读取,直到在内存中碰到'\0'为止。


3.
char arr_2[] = "123";

printf("sizeof arr_2  = %zu\n", sizeof arr_2);

用双引号引起来的字符串,如果结尾没有人为的添加'\0',那么系统会自动在结尾补上'\0', 所以这一个字符串里面其实有4个元素,分别为:

‘1’,‘2’, ‘3’, ‘\0’

故sizeof读取的是4个char类型的数据,所以输出 4

另外,我们也发现了sizeof后面的括号在特定的情况下,是可以省略的,这也进一步说明了sizeof是操作符,而不是函数。因为函数的括号是绝不可省略的。


4.
char arr_2[] = "123";

printf("strlen(arr_2) = %zu\n", strlen(arr_2));

我们现在已经知道了,strlen遇'\0'停止,然后返回'\0'之前的元素个数,所以返回 3