天天看点

正确理解sizeof和strlen的用法,这一篇就够了

1、关于数组做sizeof的参数不退化,作函数形参传递给sizeof则退化为指针的准确理解

sizeof操作的对象为指针时,得到的结果是指针的大小(32位系统为4字节,64位为8字节)。但对象为数组时,得到的结果是整个数组的大小。但有一种情况除外,参看下图。

正确理解sizeof和strlen的用法,这一篇就够了

数组作形参传递给子函数,其在子函数中会变为指针。

此时对其进行sizeof运算,又变成了对指针进行运算。结果看上图所示。

(网上有“数组做sizeof的参数不退化,传递给strlen则退化为指针”的说法,不知道是什么意思,有知道的同学可以教我一下。)

2、strlen函数用来计算字符串中字符的个数

strlen只能用来计算字符数组的大小,不能计算其他类型数组大小。实际使用中常常有人会误用来计算int类型等其他类型数组的大小,这是得不到结果的。

正确理解sizeof和strlen的用法,这一篇就够了

strlen是库函数,计算数组大小时从给定的地址开始,到遇到第一个'\0'结束。

3、sizeof运算符不可以用来计算字符串的长度

sizeof用于获取类型或表达式所占内存的大小,而不可以用来计算字符串的长度。如果你一定要这么做,那将会得到如下结果:

正确理解sizeof和strlen的用法,这一篇就够了

即得到的是指针的大小。计算字符串长度应使用strlen函数,而非sizeof运算符。

但如果用sizeof来计算字符数组则又是另一种情况,具体参考1中所述。

从此也可以看出字符串虽然在某些情况下可以当作字符数组来使用,但两者不能完全等同。因为字符串存放在内存中的字符串常量区,而字符数组则存放于栈区,存放的内存块不一样,导致两者具有不同的特性。

4、sizeof运算符计算malloc分配的内存同样只能得到指针的大小

sizeof计算malloc申请的空间,得到的大小是指针的大小:

正确理解sizeof和strlen的用法,这一篇就够了