C语言面试题更新 2026-08-03

在 C 语言里,sizeof 究竟是函数还是运算符?它是在编译期还是运行期求值的?

考察说明

考查对 C 语言 sizeof 本质和计算时机的理解。

回答思路

  1. 【回答框架 1】sizeof 是 C 语言内置的运算符,不是函数。它用于获取对象或类型的字节大小,语法上像函数,但本质是一元运算符,编译器在编译期处理,不产生函数调用。
  2. 【回答框架 2】sizeof 的计算时机分两种情况。对类型和大部分表达式,sizeof 在编译时求值,编译器直接计算静态类型的大小,例如 sizeof(int) 是编译期常量。对变长数组(VLA),sizeof 在运行时求值,因为变长数组长度在运行时确定。
  3. 【回答框架 3】sizeof 不计算表达式的值,只考虑其类型。例如 sizeof(a++) 不会执行自增,a 的值不变。这体现了 sizeof 的编译期特性。
  4. 【回答框架 4】使用 sizeof 的常见场景包括:求数组元素个数、分配内存(如 malloc(sizeof(int)))、保证代码可移植性。使用 sizeof 时要注意指针和数组的区别,sizeof(指针) 在 64 位系统通常为 8,而 sizeof(数组) 返回整个数组的字节数。
  5. 【关键点 1】sizeof 是一元运算符,不是函数。
  6. 【关键点 2】对固定类型和表达式在编译期求值,对变长数组在运行期求值。
  7. 【关键点 3】sizeof 不执行表达式,只依据类型推导大小。
  8. 【关键点 4】在 64 位系统中,sizeof(指针) 通常为 8 字节。
  9. 【关键点 5】数组名作为参数传递后会退化为指针,sizeof 得到的是指针大小而非数组大小。
  10. 【易错点 1】误将 sizeof 当函数使用,混淆运算符与函数调用。
  11. 【易错点 2】在函数参数中直接用 sizeof(数组名),得到的是指针大小而非数组大小。
  12. 【易错点 3】忽略变长数组的运行时求值特性,导致误用编译期常量假设。