77.sizeof和strlen

发布时间 2023-03-29 19:37:33作者: CodeMagicianT

1.sizeof运算符

●sizeof运算符返回一条表达式或者一个类型名字所占的字节数,sizeof运算符满足右结合律,其所得的值是一个是size_t类型的常量表达式

●size_t是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。

运算符的运算对象有两种形式:

sizeof (type)
sizeof expr//返回的是表达式结果类型的大小。与众不同的一点是,sizeof并不实际计算其运算对象的值:
Sales_data data, *p;
sizeof(Sales_data);//存储Sales_data类型的对象所占的空间大小
sizeof data;//data的类型的大小即sizeof(Sales_data) 
sizeof p;//指针所占的空间大小 
sizeof *p;//p所指类型的空间大小,即sizeof(Sales_data)
sizeof data.revenue;//Sales_data的revenue成员对应类型的大小
sizeof Sales_data::revenue;//另一种获取revenue大小的方式

因为sizeof不会实际求运算对象的值,所以即使p是一个空指针也是安全的,sizeof不需要真正解引用指针也知道它所指对象的类型。

sizeof运算符的结果部分地依赖于其作用的类型:

●对char或者类型为char的表达式执行sizeof运算,结果得1

●对引用类型执行sizeof运算得到被引用对象所占空间的大小

●对指针指针sizeof运算得到的得到指针本身所占空间的大小

●对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针可以是空指针,只要知道指针所指向的对象类型

●对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中的所有元素各执行一次sizeof运算并将结果求和。注意,sizeof运算不会把数组转换成指针来处理。

●对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。

2.strlen

  strlen是一种C风格字符串的函数,定义在头文件cstring中,cstring是C语言头文件string.h的C++版本

  尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。因为C风格字符串不仅使用起来不方便,而且极易引发程序漏洞

  C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。

  strlen=string length,顾名思义,该函数是用来求解字符串的长度的,所以我们也应该探讨一下字符串的概念;我们都知道在编译器中输入printf(”Hello World!”),就会输出”Hello World!”,这就是一个字符串,类似这种由双引号引起来的一串字符称为字符串面值,或者简称字符串。接着我们就需要了解一下“\0"这个转义字符了,记住任何一个字符串的结尾都会隐藏一个“\0",他是字符串的结束标志,所以我们在用strlen函数读取字符串的时候,当我们遇到“\0"时我们就要停止读取,此时“\0"前字符的个数就是字符串的长度,注意:这里的“\0"只是结束标志,仅仅告诉我们strlen函数读取到这里就要停止了,“\0"不算做一个字符!!!

size_t strlen(const char *str)//strlen的声明
char *p = "aaa";
char q[] = "bbbb";
strlen(p);//返回p的长度等于3,空字符不计算在内
strlen(q);//返回q的长度等于4,空字符不计算在内

原文链接:https://blog.csdn.net/qq_47908816/article/details/123964670

3.sizeof和strlen的区别

1.sizeof()是运算符,strlen()是库函数
2.sizeof()在编译时计算好了,strlen()在运行时计算
3.sizeof()计算出对象使用的最大字节数,strlen()计算字符串的实际长度

sizeof字符数组后面加\0

4.sizeof()的参数类型多样化(数组,指针,对象,函数都可以),strlen()的参数必须是字符型指针(传入数组时自动退化为指针)
————————————————
版权声明:本文为CSDN博主「Alkaid:」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45867159/article/details/113832384

//2023年3月28日14:39:05
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	
	char p[] = "hello";
	cout << "p: " << p << "   " << "strlen(p):" << strlen(p) << "   " << "sizeof(p):" << sizeof(p) << endl;
	char p1[] = "hello\0";
	cout << "p1: " << p1 << "   " << "strlen(p1):" << strlen(p1) << "   " << "sizeof(p1):" << sizeof(p1) << endl;
	char p2[] = "hello\\0";
	cout << "p2: " << p2 << "   " << "strlen(p2):" << strlen(p2) << "   " << "sizeof(p2):" << sizeof(p2) << endl;
	char p3[] = "hello\\\0";
	cout << "p3: " << p3 << "   " << "strlen(p3):" << strlen(p3) << "   " << "sizeof(p3):" << sizeof(p3) << endl;
	char p4[] = "hel\0lo";
	cout << "p4: " << p4 << "   " << "strlen(p4):" << strlen(p4) << "   " << "sizeof(p4):" << sizeof(p4) << endl;
	char p5[] = "hel\\0lo";
	cout << "p5: " << p5 << "   " << "strlen(p5):" << strlen(p5) << "   " << "sizeof(p5):" << sizeof(p5) << endl;

    system("pause");
    return EXIT_SUCCESS;
}

输出:

p: hello   strlen(p):5   sizeof(p):6
p1: hello   strlen(p1):5   sizeof(p1):7
p2: hello\0   strlen(p2):7   sizeof(p2):8
p3: hello\   strlen(p3):6   sizeof(p3):8
p4: hel   strlen(p4):3   sizeof(p4):7
p5: hel\0lo   strlen(p5):7   sizeof(p5):8
请按任意键继续. . .

首先一定要记住:strlen 计算的是字符串的实际长度,遇到\0即停止;sizeof 计算整个字符串所占内存字节数的大小,当然\0也要+1计算;

下面我们来分析运行结果:
《为了更清楚的解析,我将有停止计算作用的/0整体写为A实际不被控制台输出,无作用的写做/0可被输出;即strlen(A)=0,sizeof(A)=1;strlen(/0)=2,sizeof(/0)=2》

1.char p[] = "hello";首先p的结果大家应该不会错吧? p=hello,strlen=5,sizeof=6

字符串hello的最后隐藏着一个\0故sizeof计算所占字节数是6。即strlen(helloA)=5,sizeof(helloA)=6

2.char p1[] = "hello\0";p1 的结果:p1=hello,strlen=5,sizeof=7

这里\0主动结束了字符串长度的计算,但隐藏的\0仍然有意义;即strlen(helloAA)=5,sizeof(helloAA)=7

3.char p2[] = "hello\\0";p2 的结果:p2=hello\0,strlen=7,sizeof=8

第一个\转义了紧挨着的\,使得后面0只是一个普通字符,不能与前面/成为整体。即strlen(hello\0A)=7,sizeof(hello\0A)=8

4char p3[] = "hello\\\0";p3 的结果:p3=hello\,strlen=6,sizeof=8

第一个\只转义了第二个\,使得第二个\不能再转义后面,所以第三个/与0成为整体并有结束计算的作用。即p3=hello\AA

5.char p4[] = "hel\0lo";p4 的结果:p4=hel,strlen=3,sizeof=7

strlen碰到\0就停止输出和计算,所以结果是3;但sizeof不会停止而且两个\0都计算,即sizeof计算helAloA

6.char p5[] = "hel\\0lo";p5 的结果:p5=hel\0lo,strlen=7,sizeof=8

第一个\转义了紧接的\,使得后面0只是普通字符,而sizeof比strlen多计算一个\0。即计算的p5=hel\0loA

————————————————
版权声明:本文为CSDN博主「ly_1115」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ly_6699/article/details/89482591