sizeof作用于数组返回总字节数,编译期确定;strlen计算以’\0’结尾的char数组字符数,运行时逐字扫描。二者语义不同,易混淆,推荐用std::array和std::string替代。
sizeof 作用于数组时返回整个内存占用
sizeof 是编译期运算符,对数组名求值时得到的是该类型在内存中所占总字节数,包括所有元素和可能的填充。它不关心内容,只看类型定义。
常见错误是误以为 sizeof(arr) 在函数内也能得到数组长度——实际传入函数后,数组退化为指针,sizeof 返回的是指针大小(通常是 8 字节)。
- 全局或局部定义的
int arr[5]:sizeof(arr)是5 * sizeof(int)(通常为 20) - 函数参数写成
void f(int arr[5]):此时arr已是int*,sizeof(arr)返回指针大小 - 想安全获取数组长度,只能在定义作用域内用
sizeof(arr) / sizeof(arr[0]),且必须确保arr确实是数组类型
strlen 只适用于以 ‘\0’ 结尾的 char 数组
strlen 是运行时函数,原型在 中,它从首地址开始逐字节扫描,直到遇到第一个 '\0',返回前面的字符个数(不含 '\0')。它不管内存分配多大,只认内容逻辑。
典型崩溃场景:传入未初始化或未以 '\0' 结尾的 char 数组,strlen 会越界读取,触发未定义行为。
立即学习“C++免费学习笔记(深入)”;