目录
一、sizeof运算符
sizeof
是C语言中的一个重要运算符,用于计算变量或类型所占内存空间的大小,单位为字节。
1、基本特性
操作符性质:
sizeof
是单目运算符,不是函数计算对象:可以计算变量、数据类型或表达式的大小
计算时机:在编译时确定结果,不会在运行时计算
数据无关性:只关注内存空间大小,不关心内存中存储的具体数据
2、使用示例
#include <stdio.h>
int main()
{
int a = 10;
printf("%zu\n", sizeof(a)); // 计算变量大小
printf("%zu\n", sizeof a); // 括号可省略(仅变量时)
printf("%zu\n", sizeof(int)); // 计算类型大小
return 0;
}
3、注意事项
当
sizeof
用于变量时,括号可以省略(如sizeof a
)当
sizeof
用于类型时,括号必须保留(如sizeof(int)
)建议使用
%zu
格式说明符输出sizeof
的结果(size_t
类型)
二、strlen函数
strlen
是C标准库中的字符串函数,用于计算字符串长度。
1、函数原型
size_t strlen(const char *str);
2、基本特性
库函数:需要包含
<string.h>
头文件计算方式:从给定地址开始,统计直到遇到'\0'之前的字符数量
终止条件:依赖字符串末尾的'\0'(空字符)
时间复杂度:O(n),需要遍历整个字符串
3、使用示例
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'}; // 未以'\0'结尾
char arr2[] = "abc"; // 自动包含'\0'
printf("%zu\n", strlen(arr1)); // 结果不可预测,可能越界访问
printf("%zu\n", strlen(arr2)); // 正确结果:3
printf("%zu\n", sizeof(arr1)); // 3字节
printf("%zu\n", sizeof(arr2)); // 4字节(包含'\0')
return 0;
}
4、注意事项
必须确保字符串以'\0'结尾,否则会导致未定义行为
不会计算'\0'本身
对非字符串缓冲区使用
strlen
是危险的
三、sizeof与strlen的对比
特性 | sizeof | strlen |
---|---|---|
性质 | 运算符 | 库函数(需包含<string.h>) |
计算内容 | 内存空间大小(字节) | '\0'前的字符数量 |
参数类型 | 变量、类型或表达式 | 必须以'\0'结尾的字符串指针 |
执行时机 | 编译时 | 运行时 |
空字符处理 | 计入大小(如果是数组一部分) | 不计入长度(作为结束标志) |
安全性 | 总是安全的 | 可能越界访问(若无'\0') |
典型返回值 | 数组总大小 | 字符串实际长度 |
关键区别示例
对于字符数组char arr[] = "abc";
:
sizeof(arr)
返回4(包括'\0')strlen(arr)
返回3(不包括'\0')
对于指针char *p = "abc";
:
sizeof(p)
返回指针大小(通常4或8字节)strlen(p)
返回3
四、总结
理解sizeof
和strlen
的区别对于C语言编程至关重要:
sizeof
是编译时运算符,用于确定内存大小strlen
是运行时函数,用于确定字符串长度使用
strlen
时必须确保字符串正确终止数组名在
sizeof
中返回整个数组大小,而作为参数传递时会退化为指针
正确使用这两个工具可以避免常见的内存和字符串处理错误。