sizeof 核心原理:编译期的 “内存大小计算器”
2026/6/6 10:23:49 网站建设 项目流程

sizeof 是 C 语言的编译期运算符(非函数),核心作用是计算「数据类型或变量」的固有内存大小,结果在编译时就已确定,与运行期逻辑无关。

一、核心原理拆解

  1. 计算时机:编译期完成,不执行表达式
    • sizeof 不会运行括号内的表达式,仅通过表达式的 “类型” 推导大小。
    • 示例:int a=5; sizeof(a++); 中,a++ 不会执行(a 仍为 5),仅计算 int 类型大小(4 字节)。
  1. 计算对象:只关注 “固有类型”,不关心 “实际存储内容”
    • 对变量:等价于 sizeof(变量的类型)(如 sizeof(c) 等价于 sizeof(int*),c 是 int* 指针)。
    • 对类型:直接返回该类型的标准内存大小(如 sizeof(int)=4、sizeof(double)=8)。
  1. 大小规则:由类型和系统位数决定,与运行期状态无关
    • 基础类型(int、char 等):大小是语言标准或编译器规定的固定值(如 char 恒为 1 字节)。
    • 指针类型(任意 T*):大小由系统位数决定(64 位 = 8 字节,32 位 = 4 字节),与指向的类型无关。
    • 复合类型(数组、结构体):数组 sizeof(arr) = 元素个数 × 元素类型大小;结构体需考虑内存对齐(默认按最大成员类型对齐)。

二、关键误区

  • 为什么 sizeof(int* c) 是 8 字节?→ 因为 int* 是指针类型,64 位系统中所有指针类型的固有大小都是 8 字节。
  • 为什么 sizeof(c[3]) 是 4 字节?→ 因为 c[3] 的类型是 int,int 的固有大小是 4 字节,下标不改变类型。
  • 为什么 sizeof 拿不到堆内存大小?→ 堆内存是运行期 malloc 动态分配的,sizeof 编译时无法获取运行期的动态信息,只能计算指针本身的固有大小。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询