c++中sizeof和strlen的区别_c++长度计算方式对比【汇总】

发布时间 - 2026-02-02 00:00:00    点击率:
sizeof计算编译期内存大小,strlen计算运行期C字符串长度,std::string::length()才是安全的内容长度获取方式。

sizeof 计算的是类型或对象的内存字节数

sizeof 是编译期运算符,不关心内容,只看声明时的类型和布局。对数组、指针、类对象都按其在内存中实际占用的字节数返回。

常见误用:对字符指针用 sizeof 期望得到字符串长度——结果往往是 4 或 8(指针本身大小),而非字符串内容长度。

  • char arr[]

    = "hello"; sizeof(arr)
    返回 6(含末尾 '\0'
  • char* p = "hello"; sizeof(p) 返回 4 或 8(取决于平台,是指针变量大小)
  • sizeof(std::string) 返回该类对象自身固定开销(通常 24 或 32 字节),不是字符串内容长度

strlen 只适用于以 '\0' 结尾的 char* 字符串

strlen 是运行期函数,从传入地址开始逐字节扫描,直到遇到第一个 '\0',返回中间字符个数(不含 '\0')。它不检查指针是否合法,也不处理宽字符或非 C 风格字符串。

典型崩溃场景:传入未初始化的指针、无结束符的字符数组、或 std::string::c_str() 后被释放的内存。

  • char s[] = "abc"; strlen(s) 返回 3
  • char s[10] = {'a','b'}; strlen(s) 行为未定义(s[2] 值不确定,可能不是 '\0'
  • std::string str = "test"; strlen(str.c_str()) 合法,但应优先用 str.length()

std::string 的 length() / size() 才是安全的“字符串长度”

C++ 中真正面向语义的长度获取方式是 std::string::length() 或同义的 size(),它们返回的是字符串中字符的数量,与编码无关(UTF-8 下仍是字节数,但逻辑上代表 Unicode 码点数需另行处理)。

它不依赖 '\0',不扫描内存,时间复杂度 O(1),且自动管理生命周期。

  • std::string s = "café"; s.length() 返回 4(即使含 UTF-8 多字节字符)
  • s.c_str() 返回的指针可传给 strlen,但没必要——直接用 s.length() 更准更快
  • sizeof(s)strlen(s.c_str()) 都不该用于获取 std::string 的内容长度

宽字符和 std::wstring 要用 wcslen 或 wstring::length()

wchar_t* 字符串,strlen 完全失效——它只认 char'\0'。必须用 wcslen(对应宽字符版),或更推荐直接使用 std::wstring::length()

注意:Windows 下 wchar_t 是 2 字节(UTF-16),Linux 多为 4 字节(ISO 10646),wcslen 返回的是 wchar_t 个数,不是 Unicode 码点数(代理对需额外判断)。

  • wchar_t w[] = L"hi"; wcslen(w) 返回 2
  • std::wstring ws = L"?"; ws.length() 返回 2(UTF-16 代理对),但实际是 1 个 emoji
  • 跨平台统计真实 Unicode 字符数,需用 ICU、utf8cpp 等库,不能靠 sizeof/strlen/wcslen

最常被忽略的一点:sizeofstrlen 解决的是完全不同的问题——前者问“这块内存多大”,后者问“这个 C 字符串有多长”。混用不仅逻辑错,还极易引发越界或静默错误。


# linux  # windows  # 编码  # 字节  # c++  # win  # 区别  # String  # strlen  # 运算符  # 字符串  # char  # wchar_t  # 风格字符串  # 指针  # Length  # 对象  # 的是  # 才是  # 它不  # 多字  # 也不  # 第一个  # 适用于  # 仍是  # 要用  # 多大 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel如何发送系统通知?(Notification渠道示例)  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  LinuxCD持续部署教程_自动发布与回滚机制  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  手机软键盘弹出时影响布局的解决方法  如何用好域名打造高点击率的自主建站?  nginx修改上传文件大小限制的方法  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何实现本地化和多语言支持?(i18n教程)  如何快速选择适合个人网站的云服务器配置?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何在景安服务器上快速搭建个人网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在局域网内绑定自建网站域名?  如何在IIS管理器中快速创建并配置网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Swift中循环语句中的转移语句 break 和 continue  如何在阿里云高效完成企业建站全流程?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  怎么用AI帮你为初创公司进行市场定位分析?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Android okhttputils现在进度显示实例代码  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  linux top下的 minerd 木马清除方法  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  JS实现鼠标移上去显示图片或微信二维码  5种Android数据存储方式汇总  javascript中闭包概念与用法深入理解  免费网站制作appp,免费制作app哪个平台好?  清除minerd进程的简单方法  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel如何创建自定义Facades?(详细步骤)  Laravel如何实现事件和监听器?(Event & Listener实战)