功能差异 | sizeof | strlen |
本质 | 运算符 | C语言标准库函数 |
参数 | 数组、指针、类型、对象、函数等 | 只接受以\0结尾的char* |
功能 | 类型或者变量占内存的大小 | 返回字符串的长度 |
计算时间 | 编译时运算 | 运行时运算 |
计算差异 | 长度包含\0 | 长度不包含\0 |
sizeof和strlen的相同点是返回的类型都是size_t类型。
通过以下例题来深入讲解他们之间的差异:
例1:
char c[] = “abc\0cba”;
问题1:sizeof(c) = ?
问题2:strlen(c) = ?
问题3:执行free(c);之后会有什么后果?
解答1:8 (计算数组c在内存中占用的大小,长度包含"\0")
解答2:3 (判断字符串c的长度,遇到"\0"结束计算,长度不包括"\0")
解答3:段错误
例二、 short a[100],sizeof(a)返回?
单个short类型长度为2,所以sizeof(a)返回2*100=200
可以使用strlen计算a的长度吗?
计算strlen(a),编译时会产生告警,因为strlen()函数只接受类型为char *的参数,强制转换类型后计算strlen((char *)a),结果返回0