sizeof 字符串长度

上周朋友在写代码的时候,误以为sizeof可以直接计算字符串的长度。
他写了char str[] = "hello";,然后print(sizeof(str));,结果是6 他一头雾水,以为字符串的长度是6 我告诉他sizeof计算的是整个数组的大小,包括最后一个“\0”。
他想,哦,那我必须使用英镑。

2 02 3 年,我教会了他这种区别。
也就是说,sizeof 是一个字节,strlen 是字符数。
他还表示,以后不会使用sizeof来计算字符串长度。

我的朋友是编程初学者,学东西很快。
他说,你说得对,sizeof不能直接用来计算字符串的长度,你可以查一下。

字符串长度怎么计算(sizeof)?

嘿嘿,你说的太绕了,我帮你整理一下。

上周,一位客户问我 C++ 中的 sizeof 和字符串发生了什么情况。
我告诉你我理解的版本。

你看,sizeof是一个测量内存占用多少的东西,无论是直接测量类型还是测量变量。

例如,char p[] = "hello";这里,p是一个字符数组,大小为6 个字节,因为“hello”有5 个字符,加上末尾的\0,所以是6
此时,测量sizeof(p)时,测量的是整个数组,结果是6
但是!如果你将其重写为 char p = "hello";其中 p 是指向字符串常量“hello”的指针。

此时测量了sizeof(p),结果为4 无论指针指向什么,在6 4 位系统上都是4 或8 字节,在3 2 位系统上是4 字节。

重点来了。
接下来你说的是 cout << sizeof> p是一个指针,指针的大小肯定不是6
对于strlen(p)来说,这个函数测量的是字符串的长度,不包括\0,所以“hello”就是5
字符数组是内存中的一串连续的字节,每个字节存储一个字符,以\0结尾。
这种结构特别适合字符串操作,比如你提到的子字符串查找、插入和删除。

字符串相等的条件是长度相同且每个字符匹配相同。
这是正确的。

我还了解模式匹配,即找到子字符串在主字符串中首次出现的位置。

就存储方式而言,顺序存储就是像现在这样的连续存储,链接存储就是将指针放在一起。
每个都有其优点和缺点。

无论如何,请记住:测量数组意味着测量其内部有多少字节,测量指针意味着测量指针本身占用了多少内存。

数组所占字节怎么算

说白了:用sizeof来统计数组的字节数,但要注意细节。

整数数组:5 个int占用2 0个字节,int占4 个字节。

字符数组:“hello”占7 个字节,字符为1 个字节。

指针和数组不是一回事。
charptr 是 4 或 8 个字节,而不是字符串的长度。

float数组:2 个float占8 个字节,float占4 个字节。

多维数组:按级别计算。
int[2 ][3 ]占用1 2 个字节,2 3 4
动态分配:malloc分配后,sizeof(arr)统计整个数组。

结构体数组:struct{int a; char b;} 占用8 个字节,arr[1 0] 占用8 0个字节。

在编译时计算。
sizeof(char) 是 4 或 8 ,而不是字符串。

对于动态分配的指针,sizeof 返回指针的大小,而不是数组。

注意char和char[]的区别。