单片机/C/C++八股:(十八)C/C++ 中 sizeof 和 strlen 的区别

上一篇 下一篇
C++ 中指针和引用的区别

C/C++ 中 sizeof 和 strlen 的区别

本质不同:

  • sizeof:是一个编译时运算符 ,用于获取 变量或类型所占的字节数 (包括 \0 )。
  • strlen:是一个函数 (定义在 <string.h><cstring> 中),用于计算 字符串的实际长度 (不包括结尾的空字符 \0)。

具体对比:

对比项 sizeof strlen
类型 编译时运算符 函数
参数要求 任何变量或类型 指向以 \0 结尾的连续字符序列的指针(char 数组或 char 指针)
返回值 变量在内存中占用的总字节数(包含 /0 返回字符串中有效字符的个数(不包含 /0
返回值类型 size_t size_t
计算时机 在编译时确定(除了 C99 的变长数组) 在运行时计算

注意:

  • 使用 strlen 时,需要包含 <string.h><cstring> 头文件。
  • 关于 strlen 的输入参数虽然一般都说是字符串,但本质上是指向以 \0 结尾的连续字符序列的指针。 strlen 函数的运作方式是:从这个指针开始,往后逐个读取字符,直到遇到第一个 \0 为止,返回中间经过的非空字符个数。
    • 字符串字面量在内存中的存储方式是字符数组,作为参数传入时,其实传入的是字符数组的首地址。
  • strlen 不能用于未以 \0 结尾的字符数组(否则会越界读取,导致崩溃或错误结果)。
  • sizeof 作用于数组时能返回整个数组大小,但一旦数组作为参数传入函数,就会退化为指针,此时 sizeof 只返回指针大小。

示例:

c 复制代码
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";        // 实际存储为 {'H','e','l','l','o','\0'}
    char *p = "Hello";

    printf("strlen(str) = %zu\n", strlen(str));   // 输出:5
    printf("sizeof(str) = %zu\n", sizeof(str));   // 输出:6(5个字符 + 1个\0)

    printf("strlen(p) = %zu\n", strlen(p));       // 输出:5
    printf("sizeof(p) = %zu\n", sizeof(p));       // 输出:8(在64位系统上,指针大小为8字节)

    return 0;
}

运行结果:

复制代码
5
6
5
8

相关推荐
旖-旎4 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Darkwanderor5 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽8085 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
REDcker6 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
second607 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴7 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm8 小时前
linux之线程概念和控制
linux·开发语言·c++
hehelm8 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
hansang_IR8 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
无相求码9 小时前
【C语言】字符串的本质是什么,为什么 strlen 会读到野内存
c语言·开发语言