strlen和sizeof的区别 📅 发布时间:2026/9/11 17:35:34 👁 浏览次数: strlen和sizeof的区别1. 本质不同编译期 vs 运行期· sizeof是运算符操作符不是函数。它在编译阶段就由编译器计算出结果除了C99的可变长数组VLA。· strlen是库函数定义在 string.h 中。它必须在程序运行阶段才能计算出结果。2. 计算范围不同最核心含结束符 vs 不含· sizeof计算的是占用内存的总字节数。如果数组定义了大小它算总容量如果数组用字符串初始化它包含末尾的隐藏 \0。· strlen计算的是字符串有效长度它从起始地址开始数直到遇到第一个 \0 就停止不包含 \0。 基础示例数组情况#include stdio.h #include string.h int main() { char arr[] hello; // 实际内存: h e l l o \0 (共6字节) printf(%zu\n, sizeof(arr)); // 输出 6 (计算整个数组占用的字节数包含\0) printf(%zu\n, strlen(arr)); // 输出 5 (只数有效字符遇到\0停下) return 0; }3. 指针陷阱面试必考这正是文章中重点标注的“容易踩坑”点。当把数组名传给指针后sizeof只认指针变量本身的大小而strlen依然顺着地址去找\0。 指针示例#include stdio.h #include string.h int main() { char arr[] hello; char *p arr; // p指向数组首地址 // 64位系统下指针变量p本身占 8 个字节存地址与指向的内容无关 printf(%zu\n, sizeof(p)); // 输出 8 (32位系统输出4) // strlen从p指向的地址开始数直到遇见\0依然是5 printf(%zu\n, strlen(p)); // 输出 5 return 0; }4. 适用范围与类型提升· sizeof万能。可以用于任何类型int、double、结构体、指针甚至可以用于表达式而不执行表达式只看表达式的最终类型。· strlen专用。只能用于以 \0 结尾的字符数组/指针如果传入没有结束符的字符数组会越界导致结果随机。 类型提升示例对应你文章中的 a 3.14int a 10; // sizeof不会真的去运算a3.14它只推导出结果的类型是double所以返回8 printf(%zu\n, sizeof(a 3.14)); // 输出 8 (double占8字节)---一图胜千言速记表对比项sizeofstrlen本质运算符编译时计算函数运行时调用头文件不需要关键字需要#include string.h计数依据看数据类型和编译器分配看内存中从起始位置到第一个\0是否包含\0包含针对字符串数组初始化不包含参数类型任意类型、变量、表达式必须是char *字符指针返回值size_t无符号整型size_t无符号整型打印提醒两者返回值都是 size_t无符号数打印时建议使用 %zu不要用 %d否则可能出现无符号数转有符号数导致打印异常如超大数字的问题。