【C++】008、sizeof与strlen的去呗
·
一、本质区别
-
sizeof是C++操作运算符,在编译期计算内存字节数
-
strlen是C标准库的函数,在运行期通过遍历直到遇到'\0'来计算字符串的长度
二、五大核心区别
|
对比 |
sizeof |
strlen |
|
本质 |
运算符(sizeof(int)) |
函数库(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位系统)或 4(32位系统),指针本身的大小
strlen(p); // ✅ 结果 = 5 (p 指向字符串首地址,遍历得到长度)
// ⚠️ 终极陷阱:当数组作为函数参数传递时!
void func(char arr[]) {
// 注意:这里的 arr 表面上写的是数组,但编译器会将它调整为指针!
sizeof(arr); // ❌ 结果 = 8(指针大小),而不是数组大小!
strlen(arr); // ✅ 结果 = 字符串长度(因为 arr 退化为指针,但所指内容还在)
}
四、结构体/类中sizeof与内存对齐
-
sizeof计算的是对象的内存占用,包括内存对齐(Padding)
struct 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' 之前的字符数,与结构体无关。
更多推荐

所有评论(0)