首页 >> 宝藏问答 >

问sizeof 的用法 C 语言运算符深度讲解

2026-11-12 11:33:14

答

sizeof 是 C 语言里面的运算符,不是函数,作用是计算数据类型或者变量所占内存的字节大小,返回值类型是 size_t 无符号整数类型,它是 C 语言入门非常核心的知识点,也是笔试面试高频考点。很多初学者会误以为 sizeof 是库函数,这个是最常见误区,它属于编译期运算符,大部分场景在编译阶段就已经算出结果,只有 VLA 变长数组这种特殊情况,才会在程序运行时计算数值。sizeof 后面可以写类型名,也可以写变量名表达式,计算出来的字节数会受到编译器位数影响,32 位平台和 64 位平台同一个类型得到的结果经常不一样,比如指针类型,32 位是 4 字节,64 位是 8 字节,这点写跨平台代码的时候一定要重点留意。

基础语法格式

第一种 sizeof (类型名) 例如 sizeof (int)

第二种 sizeof (变量或者表达式) 例如 sizeof (arr)

补充简写形式 sizeof 表达式,不带括号,但是类型名必须带括号,日常编码推荐统一加上括号,代码可读性更好

常见类型 sizeof 参考表 64 位平台

类型sizeof 结果 字节
char1
short2
int4
long8
long long8
float4
double8
任意指针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 会存在细微差异,实际开发请以当前编译器官方文档为准。

 

相关阅读

标签: sizeof的用法
最新文章