sizeof和strlen你真的清楚了吗?

以下大幅摘自https://blog.csdn.net/magic_world_wow/article/details/80500473
感谢好文不再迷茫。


区别

  1. sizeof操作符的结果类型为size_t,它在头文件用typedfe定义为unsigned int类型,该类型保证能容纳实现所建立的最大对象的字节大小,计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。
  2. sizeof是运算符,可以使用类型或者函数做参数 。strlen是函数,必须使用char*(字符串)做参数,且必须是以’‘\0’'结尾的。
    比如:
int function();
printf("%d",sizeof(function()));//sizeof可以使用函数做参数
  1. sizeof是在编译的时候就将结果计算出来了,是类型所占空间的字节数,所以以数组名做参数时计算的是整个数组的大小。而strlen是在运行的时候才开始计算结果,这是计算的结果不再是类型所占内存的大小,数组名就退化为指针了。

  2. sizeof不能计算动态分配空间的大小。

具体区别举例示意如下:

	char* ss = "0123456789";
	printf("%d\n",sizeof(ss));//结果为8,ss是指向字符串常量的字符指针,sizeof 获得的是一个指针占的空间,应该是长整型的。
	printf("%d\n",sizeof(*ss));//结果为1 计算第一个char字符数据所占用的空间,为1
	printf("%d\n",strlen(ss));//结果为10 计算数据的实际大小,在\0之前截止
	printf("%d\n",strlen(*ss));//段错误  strlen是函数,只能以char*(字符串)做参数


char s[] = "0123456789";
sizeof(s);     //结果 11   ===》s是数组,计算到\0位置,因此是10+1
strlen(s);     //结果 10   ===》有10个字符,strlen是个函数内部实现是用一个循环计算到\0为止之前
sizeof(*s);    //结果 1    ===》*s是第一个字符

char s[100] = "0123456789";
sizeof(s);     //结果是100 ===》s表示在内存中的大小 100×1
strlen(s);     //结果是10  ===》strlen是个函数内部实现是用一个循环计算到\0为止之前

int s[100] = "0123456789";
sizeof(s);     //结果 400  ===》s表示再内存中的大小 100×4
strlen(s);     //错误      ===》strlen的参数只能是char* 且必须是以‘\0‘结尾的

char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);\\结果是 4 3 3 2

char p[] = {
    
    'a','b','c','d','e','f','g','h'};
char q[] = {
    
    'a','b','c','d,'\0','e','f','g'};
sizeof(p);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(p);     //为一个随机值,结果与编译器有关,不同编译器结果一般不同
sizeof(q);     //结果是8 ===》p表示在内存中的大小 8×1
strlen(q);     //结果为4 ===》存在'\0',遇到'\0'计算停止。

总结

*sizeof 是操作符, strlen为函数。
*sizeof 可以使用类型作为参数,如int char。
strlen只能使用 char *做参数且以\0为结尾。
*sizeof 为数组时候不退化, 传递给strlen时数组会被退化成指针。

猜你喜欢

转载自blog.csdn.net/qq_44333320/article/details/125697739