sizeof 是 C 语言里面的运算符,不是函数,作用是计算数据类型或者变量所占内存的字节大小,返回值类型是 size_t 无符号整数类型,它是 C 语言入门非常核心的知识点,也是笔试面试高频考点。很多初学者会误以为 sizeof 是库函数,这个是最常见误区,它属于编译期运算符,大部分场景在编译阶段就已经算出结果,只有 VLA 变长数组这种特殊情况,才会在程序运行时计算数值。sizeof 后面可以写类型名,也可以写变量名表达式,计算出来的字节数会受到编译器位数影响,32 位平台和 64 位平台同一个类型得到的结果经常不一样,比如指针类型,32 位是 4 字节,64 位是 8 字节,这点写跨平台代码的时候一定要重点留意。
基础语法格式
第一种 sizeof (类型名) 例如 sizeof (int)
第二种 sizeof (变量或者表达式) 例如 sizeof (arr)
补充简写形式 sizeof 表达式,不带括号,但是类型名必须带括号,日常编码推荐统一加上括号,代码可读性更好
常见类型 sizeof 参考表 64 位平台
| 类型 | sizeof 结果 字节 |
|---|---|
| char | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| long long | 8 |
| float | 4 |
| double | 8 |
| 任意指针 | 8 |
重点核心知识点
数组使用 sizeof 的时候,sizeof (数组名) 得到的是整个数组全部元素占用总字节数,但是数组名一旦作为函数参数传参,数组会退化成指针,此时 sizeof 得到的是指针大小,不再是整个数组总大小,这个是笔试最容易挖坑的考点。
VLA 变长数组,C99 标准新增特性,数组长度是运行时变量,这种场景 sizeof 是运行期求值,不属于编译期计算。
sizeof 内部表达式不会真正执行,也就是表达式里面的自增自减运算不会生效,例如 sizeof (i++),i 的值不会增加,因为编译阶段就已经完成计算。
学习使用步骤
第一步 分清本质,记住 sizeof 是运算符,不是函数,返回类型 size_t
第二步 练习两种写法,类型加括号,变量可以带或者不带括号
第三步 掌握数组名特殊规则,区分数组名代表整个数组,和数组退化为指针两种情况
第四步 区分 32 位和 64 位平台数值差异,理解指针大小随平台变化
第五步 练习代码案例,写代码打印 sizeof 结果,观察输出数值
综合总结,sizeof 核心功能就是获取内存字节长度,最大考点就是数组退化,编译期求值,还有 size_t 无符号特性,做判断的时候不要直接和负数比较,无符号数和有符号数比较会发生隐式转换,产生逻辑 bug。
【常见问题】
问题 1 sizeof 是函数吗
回答 1 sizeof 不是函数,sizeof 是 C 语言内置运算符,大部分情况在编译阶段完成计算。
问题 2 sizeof 计算数组的时候为什么会出现数组退化
回答 1 sizeof 如果数组名不是单独作为 sizeof 操作数,传参之后数组退化为指针,sizeof 得到指针大小,不再是数组总字节。
问题 3 sizeof 返回值是什么类型
回答 1 sizeof 返回值类型是 size_t,属于无符号整数类型,做比较运算的时候要注意无符号带来的坑。
【免责申明】
本文是 C 语言基础知识科普,不同编译器标准 C89 C99 C11 会存在细微差异,实际开发请以当前编译器官方文档为准。


