指针本身不携带数组长度信息,int或char等原始指针指向数组后即丢失大小;唯一可靠方式是显式传递size_t长度参数、使用哨兵值(如'\0')、依托std::vector/array的size(),或自行记录new分配的n值。

指针本身不携带数组长度信息
在 C++ 中,int* 或 char* 这类原始指针一旦指向数组(比如通过 arr 或 &arr[0]),就完全丢失了数组大小。编译器不会把 sizeof(arr)/sizeof(arr[0]) 的结果“存进”指针里——它只是一个内存地址。
这意味着:你不能对任意一个 int* p 调用某个函数或操作来安全地得到它原本指向的数组长度。这不是限制,而是设计事实。
哪些场景下能“间接”知道长度
只有当你控制上下文、或有额外约定时,才能确定长度。常见可靠方式包括:
- 传参时**额外带一个
size_t len参数**(最常用、最安全) - 使用以
\0结尾的char*字符串(仅限 C 风格字符串,且必须确保结尾存在) - 指向的是
std::array或std::vector的内部数据(如v.data()),但此时你应该直接用v.size(),而不是依赖指针 - 指针来自
new T[N],且你**自己记住了N** ——但别试图从指针反推,C++ 不提供接口
为什么 sizeof(p)/sizeof(*p) 不行
因为 p 是指针,不是数组。假设:
int arr[10] = {};
int* p = arr;
那么 sizeof(p) 是指针大小(通常是 4 或 8 字节),sizeof(*p) 是 int 大小(通常 4 字节),结果恒为 1 或 2,和数组长度 10 完全无关。
只有 sizeof(arr)/sizeof(arr[0]) 在 arr 是真实数组(非退化为指针)时才有效——比如在定义它的同一作用域内。
容易踩的坑:误信运行时类型信息或调试器显示
某些 IDE 调试器会“猜测”指针后面有多少元素(比如显示 “10 elements”),但这只是基于调用栈、符号表或分配上下文做的启发式推测,不可靠、不跨平台、不能用于代码逻辑。
还有人尝试读取内存管理元数据(如 malloc 前面的块头),这不仅不可移植,而且在 new、栈数组、全局数组等场景下根本不存在对应结构。
真正需要长度的地方,永远要显式传递、显式存储、或用容器封装。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











