经常会遇到问 sizeof 与 strlen 的区别,虽然知道它们之间的区别,但都没有系统的认识到,因此在此处记录。
sizeof
sizeof 是 C/C++ 中的一个运算符,用于计算对象或类型所占空间的字节大小。它有如下两种表示方式:
sizeof(type)
sizeof expression
- sizeof 不能用于函数类型(fountion types )、不完整类型(incomplete types)以及位域(bit-field glvalues)。
- 当 sizeof 运用到引用类型时,它返回引用类型的字节大小。
- 当 sizeof 运用到类类型时,它返回包含对齐填充的字节大小。
- 当 sizeof 运用到空类上时,总是返回 1 。
- 当 sizeof 运用于表达式时,它并不执行表达式。
strlen
strlen 是 C/C++ 中的一个函数,用于计算字符串的字节长度,以空字符(null)结尾。由于 strlen 是函数,因此后面必须跟括号,其函数原型如下:
size_t strlen(const char *str);
由函数原型可知, strlen 的参数是字符串指针,从而不能给其他类型参数。
示例
sizeof 与 strlen 示例程序
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "\0"; // 默认会在字符串后面添加一个'\0',因此sizeof计算出来为2
char str2[10] = "abcdef";
char str3[1] = "\0";
int a = 7, b = 3;
int c = 0;
printf("sizeof & strlen\n");
printf("sizeof(str1) = %zd\n", sizeof(str1));
printf("strlen(str1) = %zd\n", strlen(str1));
printf("sizeof(str2) = %zd\n", sizeof(str2));
printf("strlen(str2) = %zd\n", strlen(str2));
printf("sizeof(str3) = %zd\n", sizeof(str3));
printf("strlen(str3) = %zd\n", strlen(str3));
printf("\nsizeof\n");
printf("sizeof(c=a+b) = %zd\n", sizeof(c=a+b));
printf("c = %d\n", c);
return 0;
}
输出结果如下:
sizeof & strlen
sizeof(str1) = 2
strlen(str1) = 0
sizeof(str2) = 10
strlen(str2) = 6
sizeof(str3) = 1
strlen(str3) = 0
sizeof
sizeof(c=a+b) = 4
c = 0
总结
- sizeof 是运算符, strlen 是函数;
- sizeof 后可跟括号也可不跟括号,strlen 是函数必须跟括号;
- sizeof 后跟类型或表达式, strlen 参数类型为char * ;
- sizeof 计算类型或表达式所占字节大小, strlen 计算字符串长度(遇到
\0
结束); - sizeof 后接表达式时,不会对表达式求值。
- 在 C++ 中对空类运用 sizeof 总是返回
1 。
参考文献
[1] http://en.cppreference.com/w/cpp/language/sizeof
[2] http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen