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 语言内存模型和类型系统的基础工具
相关推荐
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
Navigator_Z5 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
水饺编程8 小时前
第2章:Linux 基础,clear 命令
linux·c语言·汇编
程序喵大人8 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
无敌贵点大王8 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展
微三云 - 廖会灵 (私域系统开发)8 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的9 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质9 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言