当前位置: 首页 > news >正文

C语言高频面试题——sizeof和strlen的区别


1. 功能与用途

特性sizeofstrlen
功能计算变量或类型所占的内存大小(字节)计算字符串的长度(字符数,不包含 \0
适用对象任何数据类型或变量\0 结尾的字符数组(字符串)
返回值类型size_t(无符号整型)size_t(无符号整型)

2. 核心区别

sizeof
  • 编译时计算
    • 对于静态数组或固定类型,sizeof 的结果在编译时确定。
    • 例如:sizeof(int) 的结果由编译器直接确定。
  • 包含终止符 \0
    • 对于字符数组,sizeof 会包含字符串末尾的 \0
    • 示例:
      char str[] = "hello";
      printf("%zu", sizeof(str)); // 输出 6(5个字符 + 1个'\0')
      
  • 可作用于类型或变量
    • 可以直接对类型使用 sizeof,例如 sizeof(int)
    • 也可以对变量使用,例如 sizeof(arr)
strlen
  • 运行时计算
    • 必须遍历字符串直到遇到 \0,因此结果在运行时确定。
  • 不包含终止符 \0
    • 仅统计 \0 之前的有效字符数。
    • 示例:
      char str[] = "hello";
      printf("%zu", strlen(str)); // 输出 5
      
  • 仅作用于字符串
    • 参数必须是一个指向以 \0 结尾的字符数组的指针。

3. 示例对比

示例 1:字符数组
char arr[] = "hello";
printf("sizeof(arr) = %zu\n", sizeof(arr)); // 输出 6(包含 '\0')
printf("strlen(arr) = %zu\n", strlen(arr)); // 输出 5
示例 2:字符指针
char* ptr = "hello";
printf("sizeof(ptr) = %zu\n", sizeof(ptr)); // 输出 8(64位系统中指针占8字节)
printf("strlen(ptr) = %zu\n", strlen(ptr)); // 输出 5
示例 3:动态分配的内存
char* dynamic_str = malloc(10 * sizeof(char));
strcpy(dynamic_str, "hi");
printf("sizeof(dynamic_str) = %zu\n", sizeof(dynamic_str)); // 输出 8(指针大小)
printf("strlen(dynamic_str) = %zu\n", strlen(dynamic_str)); // 输出 2
free(dynamic_str);

4. 关键注意事项

sizeof 的常见陷阱
  • 数组退化为指针
    • 当数组作为函数参数传递时,会退化为指针,此时 sizeof 返回指针大小而非数组大小。
    void func(char arr[]) {printf("%zu", sizeof(arr)); // 输出 8(指针大小)
    }
    
  • 结构体对齐
    • sizeof 计算结构体大小时会包含填充字节(内存对齐)。
    struct Example {char c;    // 1字节int i;     // 4字节
    };
    printf("%zu", sizeof(struct Example)); // 输出 8(假设对齐到4字节)
    
strlen 的常见陷阱
  • 未初始化的字符串
    • 如果字符串未以 \0 结尾,strlen 可能导致越界访问。
    char str[5] = {'h', 'e', 'l', 'l', 'o'}; // 未显式添加 '\0'
    printf("%zu", strlen(str)); // 未定义行为(可能无限循环)
    
  • 修改字符串内容
    • 如果字符串中间包含 \0strlen 会提前终止。
    char str[] = "hello\0world";
    printf("%zu", strlen(str)); // 输出 5(遇到第一个 '\0' 停止)
    

5. 使用场景

场景使用 sizeof使用 strlen
计算数组容量sizeof(arr)/sizeof(arr[0])不适用(无法获取数组容量)
字符串长度不适用(包含 \0适用(统计有效字符数)
动态内存分配确定需要分配的字节数(如 malloc确定字符串所需的实际空间(需 +1 存储 \0
结构体内存布局计算结构体总大小不适用

总结

  • sizeof
    • 编译时确定内存大小。
    • 适用于所有数据类型和变量。
    • 包含字符串的终止符 \0
  • strlen
    • 运行时统计有效字符数。
    • 仅适用于以 \0 结尾的字符串。
    • 不包含终止符。

理解两者的区别可以避免以下典型错误:

  • sizeof 直接获取字符串长度(会导致多算一个 \0)。
  • strlen 计算数组容量(无法获取数组真实大小)。

示例错误代码

char str[10] = "hello";
int len = strlen(str); // 正确:len = 5
int size = sizeof(str); // 正确:size = 10
int wrong_len = sizeof(str) - 1; // 错误:依赖 sizeof 计算字符串长度

相关文章:

  • 进程的同步和互斥
  • Seata 分布式事务 快速开始
  • Crawl4AI:打破数据孤岛,开启大语言模型的实时智能新时代
  • 597页PPT丨流程合集:流程梳理方法、流程现状分析,流程管理规范及应用,流程绩效的管理,流程实施与优化,流程责任人的角色认知等
  • Docker Compose常用命令
  • 公路路面病害检测
  • 数据结构:顺序表的实现
  • 使用 Spring Boot Admin 通过图形界面查看应用配置信息的完整配置详解,包含代码示例和注释,最后以表格总结关键配置
  • 使用 rebase 轻松管理主干分支
  • 描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析
  • 数据仓库ODS、DWD、DWS、ADS各层介绍
  • 关于创建UNIX/Linux daemon进程的笔记
  • 【漫话机器学习系列】217.监督式深度学习的核心法则(Supervised Deep Learning Rule Of Thumb)
  • Spark-Streaming简介和核心编程
  • 【盈达科技GEO优化】向量数据库:人工智能营销时代的核心引擎
  • 【信息安全工程师备考笔记】第二章 网络信息安全概述
  • 门控循环单元(GRU)
  • 基于机器学习的房租影响因素分析系统
  • 力扣面试150题--有效的括号和简化路径
  • STM32 中断系统深度剖析
  • 怎样更加贴近中国消费者,运动品牌给出“本地化”选择
  • 新华时评:坚定不移办好自己的事,着力抓好“四稳”
  • 体育公益之约跨越山海,雪域高原果洛孕育足球梦
  • 从篆刻书画到装帧设计,再看钱君匋的“艺兼众美”
  • 云南富源回应“岔河水库死鱼”事件: 初步研判与水体缺氧有关
  • 解放日报:上海一季度GDP同比增长5.1%,两大新动能助推经济“开门红”