深圳家装互联网网站东莞阿里网站设计
目录
一、sizeof运算符
1、基本特性
2、使用示例
3、注意事项
二、strlen函数
1、函数原型
2、基本特性
3、使用示例
4、注意事项
三、sizeof与strlen的对比
关键区别示例
对于字符数组char arr[] = "abc";:
对于指针char *p = "abc";:
四、总结
一、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)); // 正确结果:3printf("%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中返回整个数组大小,而作为参数传递时会退化为指针
正确使用这两个工具可以避免常见的内存和字符串处理错误。
