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


相关推荐: 如何在阿里云完成域名注册与建站?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  高端建站如何打造兼具美学与转化的品牌官网?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Swift中循环语句中的转移语句 break 和 continue  详解vue.js组件化开发实践  如何在万网开始建站?分步指南解析  网站制作软件有哪些,制图软件有哪些?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  jquery插件bootstrapValidator表单验证详解  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Python进程池调度策略_任务分发说明【指导】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Internet Explorer官网直接进入 IE浏览器在线体验版网址  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  音响网站制作视频教程,隆霸音响官方网站?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何快速查询域名建站关键信息?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  常州企业网站制作公司,全国继续教育网怎么登录?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何在阿里云域名上完成建站全流程?  EditPlus中的正则表达式 实战(2)  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  装修招标网站设计制作流程,装修招标流程?  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何实现一对一模型关联?(Eloquent示例)  如何在VPS电脑上快速搭建网站?  Laravel如何配置Horizon来管理队列?(安装和使用)  黑客如何利用漏洞与弱口令入侵网站服务器?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在云虚拟主机上快速搭建个人网站?  高防服务器租用如何选择配置与防御等级?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】