sizeof和strlen的对比分析

发布于:2025-08-19 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、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、注意事项

  1. sizeof用于变量时,括号可以省略(如sizeof a

  2. sizeof用于类型时,括号必须保留(如sizeof(int)

  3. 建议使用%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、注意事项

  1. 必须确保字符串以'\0'结尾,否则会导致未定义行为

  2. 不会计算'\0'本身

  3. 对非字符串缓冲区使用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


四、总结

理解sizeofstrlen的区别对于C语言编程至关重要:

  1. sizeof是编译时运算符,用于确定内存大小

  2. strlen是运行时函数,用于确定字符串长度

  3. 使用strlen时必须确保字符串正确终止

  4. 数组名在sizeof中返回整个数组大小,而作为参数传递时会退化为指针

正确使用这两个工具可以避免常见的内存和字符串处理错误。


网站公告

今日签到

点亮在社区的每一天
去签到