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

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 计算字符串长度
http://www.xdnf.cn/news/1317.html

相关文章:

  • Unity设计模式实战:用单例和观察者模式优化你的游戏架构 (Day 36)
  • 初次尝试Ghidra
  • C++进阶--二叉搜索树
  • NGINX如何处理并发请求?你会如何调整NGINX的配置以优化性能?
  • 【Ultralytics 使用yolo12 读取tiff 数据异常解决】
  • el-table表格既出现横向滚动条,又出现纵向滚动条?
  • 跨团队协作时流程不统一,如何协调
  • 部署Megatron - LM,快速上手使用
  • 15.电感特性在EMC设计中的运用
  • (undone) 吴恩达版提示词工程 3. 迭代 (建议用到的时候再根据目录针对看)
  • 数据结构与算法(十三):图的应用-最短路径-Dijkstra/Floyd
  • 强化学习笔记(四)——SARSA、Q-learning
  • 【vue】当vant中picker选择器的值为对象数组的解决方法
  • Cline 之Plan和Act模式
  • [Java · 铢积寸累] 数据结构 — 数组类型 - 概念引入
  • 进阶算法 第一课:贪心
  • 《门》凡是过往,皆为序曲。我们的爱,和最初一样
  • Qt Creator 创建 Qt Quick Application一些问题
  • 题解:P11185 奖牌排序
  • 麒麟V10安装MySQL8.4
  • 如何应对政策变化导致的项目风险
  • windows server2019 内网离线安装mysql5.7方式;windows server2019安装软件提示丢失msvcp100.dll问题处理
  • Java集成Zxing和OpenCV实现二维码生成与识别工具类
  • zRenamer:一款刚新鲜出炉的免费文件更改工具
  • MySQL基本查询与数据操作全面解析
  • ​​批发商商城小程序制作哪家强?开启高效批发新模式!
  • 大白话说MCP(Model Context Protocol)
  • Verilog 4:数组
  • pod 创建私有库指南
  • JavaScript 数组常用方法解析