sizeof对数组名返回总字节数,对指针返回指针大小;函数参数中数组退化为指针导致sizeof失效;模板推导和std::array/std::vector的size()更安全可靠。

sizeof 对数组名和指针的行为完全不同
直接对数组变量用 sizeof 能得到总字节数,但一旦数组退化为指针(比如传进函数),sizeof 就只返回指针大小(通常是 4 或 8 字节),不是数组长度。这是最常踩的坑。
常见错误现象:sizeof(arr) 在定义处正确,在函数内变成 8 —— 因为形参 int arr[] 实际等价于 int* arr。
- 定义在当前作用域的栈数组:可以用
sizeof(arr) / sizeof(arr[0]) - 函数参数、动态分配内存(
new int[n])、std::vector或std::array:不能依赖sizeof - 全局数组或
static数组也适用sizeof,但需确保没被隐式转成指针
用模板推导数组长度(编译期安全)
利用函数模板参数不退化的特点,可以写出只接受真实数组、拒绝指针的长度获取方式:
template<typename t size_t n>
constexpr size_t array_size(T (&)[N]) {
return N;
}</typename>
调用时 array_size(my_arr) 返回元素个数,且如果传入指针会编译失败——这比运行时出错更早暴露问题。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 支持任意类型(
int、double[3]、自定义结构体等) - 返回
size_t,注意和int混用时的符号转换警告 - 不能用于
extern声明的数组(编译器看不到长度)
std::array 和 std::vector 怎么取长度
现代 C++ 应优先用容器替代裸数组。std::array 是栈上固定大小容器,std::vector 是堆上动态容器,二者都提供 .size() 成员函数。
-
std::array<int> a = {1,2,3,4,5};</int>→a.size()返回5,编译期可知 -
std::vector<int> v = {1,2,3};</int>→v.size()返回3,运行时计算 -
std::vector的.size()是 O(1),但注意它返回的是size_t,和int比较可能触发 -Wsign-compare
为什么 sizeof(char[]) 有时等于 1?
当看到 sizeof("hello") == 6 或 sizeof(char[1]) == 1,别慌——字符串字面量是 const char[N] 类型,N 包含末尾的 \0;而 char x[1] 就是 1 字节。关键看声明是否完整。
-
char s[] = "abc";→sizeof(s) == 4(含\0) -
char* p = "abc";→sizeof(p) == 8(指针大小) -
char a[3] = {'a','b','c'};→sizeof(a) == 3(没\0,不是字符串)
容易被忽略的是:C++20 起支持 std::to_array,能把初始化列表转成 std::array 并自动推导长度,比手写模板更简洁。但老项目里还是得盯紧 sizeof 的上下文。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










