C语言sizeof是函数吗?

C语言 sizeof 运算符速查

本质

  • 编译时运算符(非函数),编译阶段求值,零运行时开销
  • 返回 size_t 类型(无符号整数),表示字节数

语法

c 复制代码
sizeof(类型/变量/表达式)   // 带括号(通用)
sizeof 变量               // 仅变量可省略括号

典型大小(64位系统)

类型 字节数
char 1(标准保证)
short 2
int 4
long 8
long long 8
float 4
double 8
指针 8

四大应用场景

1. 动态内存分配

c 复制代码
int *arr = malloc(10 * sizeof(*arr));  // 推荐写法

2. 数组元素计数

c 复制代码
size_t n = sizeof(arr) / sizeof(arr[0]);
// ⚠️ 数组退化为指针后失效

3. 结构体对齐分析

c 复制代码
// sizeof 包含填充字节,≠ 成员大小之和
struct { char a; int b; char c; };  // 12 字节,非 6

4. 缓冲区声明

c 复制代码
char buf[sizeof(struct my_struct)];

关键特性

特性 说明
编译时求值 表达式不会被执行
VLA 例外 可变长度数组运行时求值
限制 不能用于 void、函数类型、不完整类型

常见陷阱

  • ❌ 函数内数组参数退化为指针
  • ❌ sizeof(指针) ≠ sizeof(指向类型)
  • ❌ 结构体含填充字节
  • ❌ size_t 与有符号数混用

核心要点

复制代码
sizeof 是理解 C 语言内存模型和类型系统的基础工具
相关推荐
晓蛋3 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿3 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy3 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
phltxy3 天前
C 语言中的数据存储:从类型到二进制位
c语言
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust