strlen只能用于合法的null-terminated C字符串,否则越界读取导致未定义行为;它不检查指针有效性或内存合法性,仅从起始地址计数至首个\0;非字符串的裸字节数组必须由调用者自行维护长度。

用 strlen 获取以 \0 结尾的 char* 长度
前提是这个 char* 指向的是合法、以 \0 结尾的 C 字符串。否则 strlen 会越界读取,触发未定义行为(常见表现:程序崩溃、返回极大值、卡死)。strlen 不检查内存合法性,只从起始地址往后数字符直到遇到第一个 \0。
- 必须确保指针非空,否则传入
nullptr会导致段错误 - 字符串必须是 null-terminated;比如
char buf[5] = {'h','e','l','l'};(没写'\0')调用strlen(buf)是危险的 -
strlen返回size_t,打印时建议用%zu或转成int(注意截断风险)
char* s = "hello"; size_t len = strlen(s); // len == 5
当 char* 不是以 \0 结尾时,不能用 strlen
比如从二进制数据、网络包、内存拷贝中拿到的裸字节数组,或者用 malloc 分配后手动填充的缓冲区——它们没有终结符,strlen 完全不可靠。
- 此时长度必须由你“自己记着”,比如通过
read()返回值、memcpy的n参数、或提前约定的固定大小 - 若想“探测”长度,只能配合额外信息:例如协议规定前 4 字节是长度字段,那就先读那 4 字节再解释
- 试图用
strnlen(带最大长度限制)代替也不解决根本问题,它只是防止越界,但无法告诉你真实数据长度
sizeof 对 char* 毫无意义
sizeof(char*) 返回的是指针本身大小(通常是 4 或 8 字节),不是它指向内容的长度。新手常误写 sizeof(p) 以为能得到字符串长度,这是典型误解。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 只有对数组名(如
char arr[] = "abc")用sizeof(arr)才有意义,此时得到的是整个数组字节数(含\0) - 一旦数组退化为指针(如传入函数后),
sizeof就只剩指针大小了
void f(char* p) {
cout << sizeof(p); // 输出 8(64位系统),不是字符串长度
}
现代 C++ 更推荐用 std::string 或 std::string_view
直接操作 char* 容易出错,尤其涉及所有权和生命周期时。如果可以改接口,优先用带长度管理的类型。
立即学习“C++免费学习笔记(深入)”;
-
std::string自带.length()/.size(),且自动维护 null 结尾和容量 -
std::string_view轻量、不拷贝,构造时显式传入指针和长度:string_view{p, n},避免歧义 - 二者都规避了 “到底有没有
\0” 的模糊性,长度信息始终明确
C++ 里 char* 本身不携带长度,所有长度信息都来自外部上下文——要么是隐含的 \0 约定,要么是你亲手维护的整数变量。漏掉这个前提,任何“求长度”的操作都是空中楼阁。

















