一、核心区别1. sizeof是运算符编译阶段求值计算整个空间占用字节数包含末尾 \0测数组、指针、结构体、基本类型都能用数组名不退化直接算出数组总大小2. strlen是库函数运行阶段遍历计算只统计有效字符个数不含 \0只针对字符串遇到 \0 立刻停止必须引头文件 string.hstrlen 是一个运行期库函数它的函数签名是size_t strlen(const char *s);1. strlen 本质只收char 字符指针 *2. 能传的三种东西字符串常量 strlen(abc)字符指针 char *p123; strlen(p)字符数组名 char arr[]xyz; strlen(arr)数组名自动退化成首元素指针 strlen 函数内部只知道这是一个地址它会顺着地址往后找直到遇到 \0 为止。它根本不知道这个地址原本是不是一个数组。3. 唯一规则必须以 \0 结尾不然乱数长度一句话只要能变成 char 的都能丢给 strlen*口述sizeof求内存总大小含结束符strlen求实际字符长度不含结束符。sizeof编译就算完strlen程序跑起来才计算。二、例子char s[] abcde;strlen(s) 5sizeof(s) 6char *p 1234;strlen(p)4sizeof(p)864位指针固定8字节三、新思路1. 数组传参变成指针此时sizeof测不出数组长度只能测出指针大小1. C语言规定数组作为函数形参会隐式退化为指针2. 函数内部只知道这是一个地址丢失数组长度信息3. sizeof 此时测的是指针变量本身占的字节不是数组整体大小4. 但 strlen 是顺着地址往后找 \0 不受退化影响依旧正常统计字符数2. 字符串没有 \0 strlen会越界乱数结果随机C语言字符串必须靠 \0 当作结束标记strlen 工作逻辑从首地址开始逐个往后数碰到 \0 立刻停下返回个数。很多人只记结果随机却忽略本质这不是函数bug是人为没遵守C字符串存储规则规范写法一定要保证末尾存 \0 。3. sizeof可算任意数据类型大小strlen只认字符串// sizeof 全能用sizeof(int); // 整型大小sizeof(double); // 浮点大小sizeof(struct A);//结构体大小sizeof(123); // 等价于 sizeof(int) → 结果为 4sizeof(3.14); //等价于 sizeof(double) → 结果为 8sizeof(a); // 合法C语言中字符常量是 int 类型 → 结果为 4// strlen 只能用在字符串strlen(hello); // 合法strlen(123); // 直接报错不能用sizeof是面向内存空间设计关注占多少字节strlen是面向文本内容设计只管有效字符数量定位完全不一样。总结用途 sizeof 占内存大小 strlen 字符串有效长度时机sizeof编译期strlen运行期结束符sizeof包含 \0 strlen不含性质运算符 vs 库函数