一、本质区别sizeof是C操作运算符在编译期计算内存字节数strlen是C标准库的函数在运行期通过遍历直到遇到\0来计算字符串的长度二、五大核心区别对比sizeofstrlen本质运算符sizeofint函数库csting、string.h计算时机编译器运行时需要遍历内存计算内容计算类型或变量占用的内存字节数包含\0参数必须是const char*, 以\0结尾的字符指针数组名行为返回整个数组占用的字节数当传入的数组名退化为指针返回指针指向的字符串长度以\0结尾空值/空类型对void*报语法错误传入nullptr是未定义行为程序崩溃三、数组作为参数退化为指针sizeof获取的就不是原始数组内容的大小了代码示例char str[] Hello; // 数组占用6字节H,e,l,l,o,\0 char* p str; // 指针指向数组首地址 // 关键对比 sizeof(str); // ✅ 结果 6 编译期计算整个数组大小包含 \0 strlen(str); // ✅ 结果 5 运行期遍历遇到 \0 停止不计数 \0 sizeof(p); // ✅ 结果 8 64位系统或 432位系统指针本身的大小 strlen(p); // ✅ 结果 5 p 指向字符串首地址遍历得到长度 // ⚠️ 终极陷阱当数组作为函数参数传递时 void func(char arr[]) { // 注意这里的 arr 表面上写的是数组但编译器会将它调整为指针 sizeof(arr); // ❌ 结果 8指针大小而不是数组大小 strlen(arr); // ✅ 结果 字符串长度因为 arr 退化为指针但所指内容还在 }四、结构体/类中sizeof与内存对齐sizeof计算的是对象的内存占用包括内存对齐Paddingstruct A { char a; int b; }; // 在 64位系统上char(1) 填充(3) int(4) 8 字节 // 而不是 1 4 5 字节。 struct B { int b; char a; }; // 同样的两个成员顺序不同int(4) char(1) 填充(3) 8 字节也是8但布局不同 // strlen 完全不关心内存对齐它只数 \0 之前的字符数与结构体无关。