c++中如何获取数组长度_c++求数组元素个数方法
发布时间 - 2026-01-02 00:00:00 点击率:次sizeof计算栈上原生数组长度仅在定义时有效,函数参数中数组会退化为指针导致结果错误;std::size可安全用于原生数组、std::array和std::vector,但不支持指针或退化后的形参。
用 sizeof 计算栈上数组长度
只有在数组是**栈上定义的原生数组**(非指针、非动态分配)时,sizeof(array) / sizeof(array[0]) 才能正确得到元素个数。这是编译期行为,不适用于函数参数传入的数组。
常见错误:把数组传进函数后还在函数内用 sizeof 算长度——此时数组已退化为指针,sizeof 返回的是指针大小(通常是 4 或 8),结果完全不可靠。
- ✅ 正确场景:
int arr[] = {1, 2, 3, 4, 5}; size_t n = sizeof(arr) / sizeof(arr[0]); // 得到 5 - ❌ 错误场景:
void func(int a[]) { size_t n = sizeof(a) / sizeof(a[0]); // 错!a 是 int*,不是数组类型 } - ⚠️ 注意:
sizeof对std::array和std::vector不适用(它们不是 C 风格数组)
用 std::size(C++17 起推荐)
std::size 是标准库提供的泛型工具,对原生数组、std::array、std::vector 等都有效,且类型安全、语义清晰。它底层仍依赖 sizeof 处理原生数组,但封装后避免了手写除法的出错可能。
- 支持栈数组:
int arr[] = {10, 20, 30}; auto n = std::size(arr); // 类型为 size_t,值为 3 - 也支持
std::array:std::array
a = {1,2,3,4}; auto n = std::size(a); // 4 - ⚠️ 不支持
int*指针,也不支持函数
形参中的数组声明(因已退化)
为什么不能对函数参数用 sizeof 或 std::size
在函数签名中写 void f(int arr[]) 或 void f(int* arr),效果完全一样:编译器只看到指针。数组长度信息在传参时就丢失了,没有任何运行时机制能从指针反推原始大小。
- 唯一可靠办法是**额外传入长度参数**:
void process(int arr[], size_t len) { for (size_t i = 0; i < len; ++i) { /* 安全遍历 */ } } - 或者改用容器:用
std::vector或& std::span(C++20),它们自带.size()方法 - ⚠️ 即使是
int arr[5]这样的形参写法,也仍是语法糖,实际还是int*
动态数组(new int[n])怎么知道长度
用 new[] 分配的数组,C++ 标准**不提供任何接口获取其长度**。运行时长度信息由实现管理,但不对用户暴露。强行尝试解析内存或依赖特定编译器行为属于未定义行为。
- ✅ 正确做法:自己记录长度,例如用
std::pair或封装成小结构体 - ✅ 更推荐:直接用
std::vector替代,v.size()直接可用,且自动管理内存 - ❌ 不要试图通过
operator new分配头信息、或用调试器看内存布局来“猜”长度
原生数组长度只能靠编译期信息;一旦退化为指针,长度就彻底丢失了——这不是限制,而是 C++ 值语义和零成本抽象的设计选择。别绕开它,用 std::vector、std::span 或显式传参才是正解。
# 工具
# 栈
# ai
# c++
# 标准库
# 为什么
# Array
# 封装
# 结构体
# int
# void
# 指针
# 接口
# operator
# 泛型
# 形参
# 的是
# 这是
# 也不
# 还在
# 才是
# 没有任何
# 遍历
# 丢失了
# 这不是
# 仍是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在宝塔面板创建新站点?
Python文本处理实践_日志清洗解析【指导】
如何在Tomcat中配置并部署网站项目?
Laravel如何发送系统通知?(Notification渠道示例)
Python图片处理进阶教程_Pillow滤镜与图像增强
如何彻底删除建站之星生成的Banner?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
如何在服务器上三步完成建站并提升流量?
如何在阿里云虚拟服务器快速搭建网站?
Laravel如何升级到最新版本?(升级指南和步骤)
打造顶配客厅影院,这份100寸电视推荐名单请查收
iOS中将个别页面强制横屏其他页面竖屏
制作电商网页,电商供应链怎么做?
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
油猴 教程,油猴搜脚本为什么会网页无法显示?
使用Dockerfile构建java web环境
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
北京网站制作的公司有哪些,北京白云观官方网站?
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel怎么清理缓存_Laravel optimize clear命令详解
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
SQL查询语句优化的实用方法总结
Laravel如何记录自定义日志?(Log频道配置)
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel如何使用Vite进行前端资源打包?(配置示例)
如何在新浪SAE免费搭建个人博客?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Swift中swift中的switch 语句
网页设计与网站制作内容,怎样注册网站?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
BootStrap整体框架之基础布局组件
个人摄影网站制作流程,摄影爱好者都去什么网站?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在云虚拟主机上快速搭建个人网站?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Python制作简易注册登录系统
🚀拖拽式CMS建站能否实现高效与个性化并存?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】


形参中的数组声明(因已退化)