strlen和sizeof的用法c语言
时间: 2025-05-14 09:00:41 浏览: 17
### C语言 `strlen` 和 `sizeof` 的区别与正确用法
#### 基本概念
- **`strlen`**: 是标准库 `<string.h>` 中的一个函数,用来计算字符串的实际长度(即有效字符的数量),返回值为无符号整数类型 (`size_t`)。它不会计入字符串结束符 `\0` 的长度[^2]。
- **`sizeof`**: 是一个操作符而非函数,用于获取变量、数据类型或表达式的存储空间大小,单位为字节 (bytes)[^1]。
---
#### 使用场景对比
##### 1. 计算数组的总内存占用
对于数组而言,`sizeof` 可以直接得到其分配的空间大小(包括未初始化的部分)。例如:
```c
int arr1[10];
printf("Size of arr1: %zu bytes\n", sizeof(arr1));
```
上述代码输出结果为 `40` 字节(假设 `int` 占 4 字节),因为 `arr1` 数组总共占据 10 * 4 = 40 字节的内存空间。
注意:如果传递给函数的是数组名,则该数组会退化为指针,此时 `sizeof` 得到的是指针本身的大小而不是原数组的真实尺寸。
##### 2. 获取字符串的有效长度
针对字符串常量或以零结尾的字符数组,可以使用 `strlen` 来统计实际包含多少个可读字符(不含终止符 `\0`):
```c
char str[] = "hello";
printf("Length using strlen: %zu characters\n", strlen(str)); // 输出5
```
这里需要注意的是,尽管定义时 `"hello"` 后面隐含了一个额外的空字符作为标记,但它并不被纳入计数范围之内。
而对于仅由单个字符组成的列表形式声明的情况,由于缺乏自动附加的终结标志位,因此无法应用此方法来测量长度:
```c
char chars[] = {'a', 'b'};
// 下列语句会产生错误警告,因chars并非严格意义上的C-style string
// size_t length = strlen(chars);
```
另外,在处理动态分配的对象或者复合结构体实例的时候,也需要特别留意两者的适用条件差异。
---
#### 示例代码展示
下面通过一段综合性的例子进一步阐明两者之间的关系及其各自的特性:
```c
#include <stdio.h>
#include <string.h>
int main(void){
char fixedStr[] = "example"; /* 静态分配 */
char dynamicStr[20]; /* 动态预留缓冲区 */
strcpy(dynamicStr,"sample");
printf("Fixed String Size:%lu Bytes\n",(unsigned long)sizeof(fixedStr));//9B incl.\0
printf("Dynamic Buffer Size:%lu Bytes\n",(unsigned long)sizeof(dynamicStr));//20B predef.
printf("Content Length Fixed Str:%lu Chars\n",(unsigned long)strlen(fixedStr));//7Ch exclud.\0
printf("Content Length Dynamic Str:%lu Chars\n",(unsigned long)strlen(dynamicStr));//6Ch exclud.\0
return 0;
}
```
运行以上程序片段将会打印如下信息:
```
Fixed String Size:9 Bytes
Dynamic Buffer Size:20 Bytes
Content Length Fixed Str:7 Chars
Content Length Dynamic Str:6 Chars
```
从中可以看出即使两个字符串的内容几乎相同,但由于它们各自所在的容器容量不同以及是否显式包含了结束标识等因素的影响下,最终呈现出的数据特征也会有所变化。
---
### 总结说明
综上所述,虽然表面上看去二者似乎都能完成某种类型的度量任务,但实际上它们的作用领域完全不同——前者专注于衡量逻辑上的序列单元数目;后者则侧重于物理层面资源消耗状况评估。所以在日常编码实践中应当依据具体需求合理选用合适的工具手段才是明智之举。
阅读全文
相关推荐


















