sizeof指针变量只取决于平台位数,与所指类型无关:32位系统为4,64位系统为8,这是c++标准保证的;它不反映指针所指向内存的大小。

sizeof 指针变量本身,和它指向什么完全无关
你写 char*、int*、std::string* 甚至 void(*)()(函数指针),只要在同一平台编译,sizeof 返回的都是指针自身的大小——32 位系统是 4,64 位系统是 8。这不是“大概”或“通常”,而是 C++ 标准保证的行为:指针就是地址,地址宽度由平台决定。
常见错误是以为 sizeof(p) 能告诉你它指向的内存有多大。比如:
char* p = new char[100]; std::cout <p>这行代码只告诉你“存储这个地址用了几个字节”,不涉及堆上那 100 字节。</p>
-
sizeof(p)→ 指针变量自身占用空间 -
sizeof(*p)→ 解引用后类型大小(char是1) -
sizeof(**p)→ 仅当p是二级指针时才合法,否则编译失败
数组退化成指针后,sizeof 失效
函数参数里声明 void func(char arr[10]),实际等价于 void func(char* arr)。此时 sizeof(arr) 返回的是指针大小(4 或 8),不是数组总大小。这是 C/C++ 语言层的硬性规则,不是编译器 bug。
容易踩坑的场景:
- 在函数内部对形参数组用
sizeof算长度 → 总是得到指针大小 - 误以为
char a[] = "hello"传入函数后还能用sizeof得到6→ 实际得到8(x64) - 用
std::vector或std::array代替裸数组时,sizeof行为完全不同(std::array保留长度信息,std::vector只返回固定开销)
sizeof 对函数调用的特殊处理
sizeof 可以对函数调用表达式求值,但**不执行函数体**,只看返回类型大小。例如:
int foo() { return 42; }
double bar() { return 3.14; }
std::cout <p>但以下写法非法:</p>
-
sizeof(foo)→ 错误:不能对函数名求值(函数名不是对象) -
sizeof(void_func())→ 错误:void类型无大小 -
sizeof(func(1, 2))→ 必须提供实参,让编译器能推导出返回类型
结构体/类中指针成员的 sizeof 不含所指内容
一个 class A { std::string s; int* p; }; 的 sizeof(A) 只包含 s 的内部指针(通常是 8 字节)、p 自身(8 字节)以及可能的填充字节,**绝不包含 s 指向的堆字符串或 p 指向的 int 内存**。这也是为什么空类 struct {}; 的 sizeof 是 1:它要确保每个对象有唯一地址,但不承诺管理任何动态资源。
真正容易被忽略的是:当你用 sizeof 估算内存占用时,如果对象里含指针或容器,必须手动加上它们指向的额外空间——sizeof 绝不会帮你做这件事。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











