1.79、C++ sizeof 和 strlen 的区别?

本质与计算时机

  • • sizeof
    • • 类型:编译时操作符(非函数)。
    • • 计算方式:根据数据类型或变量声明时的定义,直接返回其在内存中占用的字节数,不运行代码。
    • • 特点:结果由类型决定,与变量值无关。
  • • strlen
    • • 类型:运行时函数(需包含<cstring>)。
    • • 计算方式:从字符串起始地址开始遍历,直到遇到空字符\0,统计遍历的字符数(不包含\0)。
    • • 特点:依赖字符串内容,必须确保字符串以\0结尾,否则行为未定义。

适用范围

维度 sizeof strlen
适用类型 所有数据类型(基本类型、数组、结构体、类等)。 仅适用于以\0结尾的C风格字符串(char*char[])。
返回值含义 类型/变量占用的总字节数(含\0,如字符串数组)。 字符串中有效字符数(不含\0)。
是否可重载 否(操作符固定行为)。 是(可自定义实现,但需遵循C风格字符串规则)。

典型示例

char str[] = "Hello";       // 数组长度为6(5个字符 + 1个'\0')
char* ptr = str;            // 指针指向数组首元素

sizeof(str);    // 结果:6(整个数组的字节数)
sizeof(ptr);    // 结果:4/8(指针本身的字节数,与平台有关)
strlen(str);    // 结果:5(有效字符数,不含'\0')
strlen(ptr);    // 结果:5(与strlen(str)等价)

注意事项

  • • sizeof的数组退化问题
    当数组作为函数参数传递时,会退化为指针,此时sizeof返回指针大小,而非数组大小。

    void func(char arr[]) {
        sizeof(arr); // 结果:4/8(指针大小,而非数组实际大小)
    }
  • • strlen的越界风险
    若字符串未以\0结尾,strlen会持续访问内存直到遇到\0,可能导致越界访问和程序崩溃。

应用场景对比

  • • sizeof的常见用途
    • • 计算数组总字节数(如sizeof(arr) / sizeof(arr[0])求数组长度)。
    • • 确定结构体/类的内存占用(用于内存对齐分析)。
    • • 动态内存分配(如malloc(sizeof(T)*n))。
  • • strlen的常见用途
    • • 计算C风格字符串的有效长度(如字符串拷贝、拼接前获取长度)。
    • • 遍历字符串时控制循环边界(如for(int i=0; i<strlen(s); i++))。

总结

特性 sizeof strlen
核心功能 获取类型/变量的内存占用字节数。 计算C风格字符串的有效字符数。
时机/性质 编译时操作,不执行代码。 运行时函数,需遍历字符串。
关键限制 无(但需注意数组退化)。 必须确保字符串以\0结尾。
典型场景 内存分配、类型大小分析。 字符串处理、长度统计。

本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END