sizeof和strlen区分与详细解读

sizeof与strlen本质区别

sizeof是c/c++中一个关键字,可以认为是一种运算符,而strlen则是库函数,首先理解本质,接下来的区别就很好理解了。

sizeof和strlen的用法

sizeof由于本质是关键字、运算符,他的操作都是在编译阶段执行的,所以sizeof不能用来返回动态分配的内存空间大小和指针指向的内存空间大小。
strlen()是计算字符串的长度的函数,直到遇到结束符NULL就结束,返回的长度大小不包含NULL。
下面介绍不同场景下的两种的不同。

#------数组--------

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	char str[]="world";
	cout<<sizeof(str)<<endl;
	cout<<strlen(str)<<endl;
}

结果
6
5
分析:sizeof会多一个,本质原因:sizeof计算的是分配空间的实际字节数,但strlen是计算的空间中字符的个数(不包括‘\0’)。
#------指针--------

char *p="world";
cout<<sizeof(p)<<" "<<strlen(p)<<endl;

结果:4 5 (32位编译器是 4 5,64位编译器是 8 5)
这是因为sizeof是关键字,在编译时后就执行完了,他只能计算指针的所占空间大小,也就是他总是计算参数的实际大小空间,而strlen有明确的定义,是参数所给出位置的字符空间长度(不包含‘\0’)。
#--------动态开辟空间------

char *p =(char *)malloc(10);
cout<<sizeof(p)<<endl;

结果:4
还是指针空间所占的长度。

补充一个:

char p[] = {'a','b','c','d'};
char q[] = {'a','b','c','d','\0','e'};
sizeof(p);     //结果是4,因为存储的空间为4
strlen(p);     //为一个随机值,结果与编译器有关,不同编译器结果一般不同,原因是找不到到\0,
sizeof(q);     //结果是6 
strlen(q);     //结果为4,因为存在'\0',遇到'\0'计算停止
发布了8 篇原创文章 · 获赞 11 · 访问量 260

猜你喜欢

转载自blog.csdn.net/qu1512741719/article/details/105092219