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 】
相关推荐:
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
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实战)


