sizeof和strlen是C/C++中常用的两个操作符/函数,但它们的功能和用法有本质区别。
功能:计算数据类型或变量所占内存的字节数
特点: - 是编译时操作符,在编译时就确定结果 - 可以用于任何数据类型(基本类型、数组、结构体、类等) - 对于数组名,返回整个数组的大小 - 对于指针,返回指针本身的大小(通常是4或8字节)
用法示例:
int a;
printf("%zu\n", sizeof(a)); // 输出int的大小(通常4)
printf("%zu\n", sizeof(int)); // 同上
double arr[10];
printf("%zu\n", sizeof(arr)); // 输出10*8=80(假设double为8字节)
char *str = "hello";
printf("%zu\n", sizeof(str)); // 输出指针大小(通常4或8)
功能:计算以null结尾的字符串的长度(不包括null终止符)
特点: - 是运行时函数 - 只能用于以'\0'结尾的字符串 - 对于指针,返回字符串的实际长度 - 对于数组,如果包含null终止符,返回字符串长度
用法示例:
char str1[] = "hello";
printf("%zu\n", strlen(str1)); // 输出5
char *str2 = "world";
printf("%zu\n", strlen(str2)); // 输出5
char arr[10] = {'a', 'b', 'c'};
printf("%zu\n", strlen(arr)); // 未定义行为,因为没有null终止符
特性 | sizeof | strlen |
---|---|---|
类型 | 操作符 | 函数 |
计算时机 | 编译时 | 运行时 |
参数 | 类型或变量 | 必须以'\0'结尾的字符串 |
包含'\0' | 包含 | 不包含 |
指针处理 | 返回指针大小 | 返回字符串长度 |
数组处理 | 返回整个数组大小 | 返回字符串长度 |
混淆sizeof和strlen:
char str[] = "hello";
printf("%zu %zu\n", sizeof(str), strlen(str)); // 输出6和5
对指针使用sizeof期望得到字符串长度:
char *p = "example";
printf("%zu\n", sizeof(p)); // 输出指针大小,不是字符串长度
未初始化的字符串使用strlen:
char str[10];
printf("%zu\n", strlen(str)); // 未定义行为
理解sizeof和strlen的区别对于正确管理内存和字符串操作至关重要。