sizeof和strlen有什么区别?
sizeof本质是运算符(sizoof既是关键字也是运算符,不是函数哈),而strlen就是函数。sizeof后面如果是类型,则必须加括号,如果是变量,可以不加括号。
sizeof运算符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能够容纳实现所建立的最大对象的字节大小。
sizeof可以用类型作为参数,而strlen只能用char * 作为参数,而且必须是以\0结尾的。sizeof还可以以函数作为参数,如int test(),则sizeof(test())的值等于sizeof(int)的值,在32位计算机下,该值为4。
大部分编译程序的sizeof都是在编译的时候计算的,所以可以通过sizeof(x) 来定义数组维数,通常用来计算占用内存大小。而strlen则是在运行阶段计算的,用来计算字符产的实际长度。
如:
char str[20] = “0123456789”,字符数组str是编译期大小已经固定的数组,在32位计算机下,sizeof(str) = 20,而strlen是在运行期计算的大小,strlen(str) = 10。
思考:
不使用sizeof,怎么求int占用的字节数?
#define my_sizeof(value) (char *)(&value + 1) - (char *)(&value)
&value 表示获取变量 value 的地址。(char )(&value + 1) 表示获取变量 value 后面一个元素的地址,通过将其强制转换为 char 类型来确保以字节为单位进行计算。最后,用 (char *)(&value + 1) - (char *)(&value) 来计算两个地址之间的差值,得到变量 value 的大小。
这个宏定义是一种快速获取变量大小的方法,但在某些特殊情况下可能会有限制。(如包含了 padding 的结构体、指向函数的指针等),可能会导致计算结果不准确。
Tips:
- size_t 是 C 和 C++ 中用于表示内存大小和对象大小的无符号整数类型,在处理内存和数组相关的操作时非常重要。
- sizeof 运算符在编译时求值,而不是运行时。它的结果在编译时就确定了,不会因为变量的具体取值而改变。此外,sizeof 运算符不能用于动态分配的内存或函数类型。
- 在 32 位计算机上,指针类型的大小通常为 4 字节(32 位)。这是因为 32 位的寻址范围为 2^32,即 4GB,因此一个指针占据 4 字节的内存空间来存储一个地址。
而在 64 位计算机上,指针类型的大小通常为 8 字节(64 位)。这是因为 64 位的寻址范围为 2^64,即非常大,需要 8 个字节来存储一个地址。