c++中sizeof和strlen的区别_c++长度计算方式对比【汇总】
发布时间 - 2026-02-02 00:00:00 点击率:次sizeof计算编译期内存大小,strlen计算运行期C字符串长度,std::string::length()才是安全的内容长度获取方式。
sizeof 计算的是类型或对象的内存字节数
sizeof 是编译期运算符,不关心内容,只看声明时的类型和布局。对数组、指针、类对象都按其在内存中实际占用的字节数返回。
常见误用:对字符指针用 sizeof 期望得到字符串长度——结果往往是 4 或 8(指针本身大小),而非字符串内容长度。
-
char arr[]返回 6(含末尾
= "hello"; sizeof(arr)
'\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
最常被忽略的一点:sizeof 和 strlen 解决的是完全不同的问题——前者问“这块内存多大”,后者问“这个 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以上版本前端静态资源管理【教程】


