当前位置: 首页 > news >正文

C 语言 sizeof 完全用法指南

sizeof是 C 语言的运算符(不是函数),核心作用是:计算一个数据 / 类型在内存中占用的字节数,结果是size_t类型(无符号整数)。

它的用法非常固定,只有两种标准形式,所有场景都适用。


一、两种基本用法

1. 计算【数据类型】的大小

格式:sizeof(类型名)适用于:intcharfloatdouble、结构体、指针等所有 C 语言数据类型。

#include <stdio.h> int main() { // 32/64位系统常见大小(单位:字节) printf("char: %zu\n", sizeof(char)); // 1 printf("int: %zu\n", sizeof(int)); // 4 printf("float: %zu\n", sizeof(float)); // 4 printf("double: %zu\n", sizeof(double)); // 8 return 0; }

✅ 注意:类型名必须加括号,不能写成sizeof int


2. 计算【变量 / 数组 / 表达式】的大小

格式:sizeof 变量名sizeof(变量名)括号可以省略,两种写法完全等价。

#include <stdio.h> int main() { int a = 10; double b = 3.14; // 两种写法都正确 printf("a: %zu\n", sizeof a); // 4 printf("b: %zu\n", sizeof(b)); // 8 return 0; }

二、高频实用场景(必学)

场景 1:计算数组长度

这是sizeof最常用的功能!公式:数组总字节数 ÷ 单个元素字节数 = 元素个数

#include <stdio.h> int main() { int arr[] = {1,2,3,4,5}; // 总大小:5个int ×4 =20字节 // 单个元素大小:sizeof(int)=4 int len = sizeof(arr) / sizeof(arr[0]); printf("数组长度:%d\n", len); // 输出 5 return 0; }

⚠️ 坑点:数组作为函数参数传递时,sizeof 会失效(退化为指针)。


场景 2:计算字符串长度(区分 strlen)

  • sizeof:算内存占用(包含字符串末尾的\0
  • strlen:算有效字符数(不包含\0
#include <stdio.h> #include <string.h> int main() { char str[] = "hello"; printf("sizeof: %zu\n", sizeof(str)); // 6(h e l l o \0) printf("strlen: %zu\n", strlen(str)); // 5(仅有效字符) return 0; }

场景 3:计算结构体大小

会自动计算内存对齐后的总字节数:

#include <stdio.h> struct Student { int id; // 4 char name; // 1 }; int main() { printf("%zu", sizeof(struct Student)); // 8(内存对齐) return 0; }

三、核心特性(必记)

  1. 编译期计算:程序运行前就确定结果,不执行括号内的代码
    int a = 10; sizeof(a++); // a 不会自增!sizeof 不执行表达式
  2. 结果是无符号数:打印必须用%zu格式化输出(C99 标准)
  3. 指针大小固定:32 位系统指针占 4 字节,64 位系统占 8 字节
    int *p; printf("%zu", sizeof(p)); // 4(32位) / 8(64位)

四、常见错误

  1. sizeof int→ 错误(类型必须加括号)
  2. ❌ 用 sizeof 计算函数参数数组长度 → 错误(退化为指针)
  3. ❌ 用%d打印 sizeof 结果 → 不规范(建议用%zu

总结

  1. 类型sizeof(类型)→ 必须加括号
  2. 变量sizeof 变量/sizeof(变量)→ 括号可选
  3. 核心用途:求数组长度、分配内存、计算结构体大小
  4. 不执行表达式,编译期确定大小
http://www.jsqmd.com/news/990223/

相关文章:

  • 荐书|让企业文化真正成为核心竞争力,我推荐你看这本书
  • 重塑数据分析思维:Statistical Rethinking 2023如何用贝叶斯方法解决复杂问题
  • 手把手教你用FPGA实现FSK解调:从Matlab仿真到Verilog代码的保姆级流程
  • 做好Core Web Vitals优化,你的AI引用率可以提升24%
  • Behdad字体实战指南:如何为波斯语项目选择最佳开源字体
  • SpringBoot开发秘籍:轻松应对企业级项目挑战
  • 数据的加密与解密(05:23)
  • 国民技术N32G45X实战:手把手教你为3.5寸ILI9488屏移植LVGL 8.3(附完整工程)
  • Windows HEIC缩略图预览终极指南:3步解决苹果照片显示难题
  • MATLAB实战:手把手教你仿真三种天线阵列(ULA/URA/UCA)的波束形成图
  • 济南黄金回收怎么选 实测六家靠谱门店 - 余生黄金回收
  • 苹果扩展 App Store 捆绑套餐,今年晚些时候可订阅打包 iPhone 应用!
  • 西安灭蟑螂公司品牌与电话:2026年行业分析与服务指南 - 优质品牌商家
  • 贵阳黄金回收市场实测六家正规商家 - 余生黄金回收
  • 杭帮菜主题网页实战包:首页/概况/视频/图赏/注册五页源码+素材+教学文档+答案
  • 我是怎么从装修跨界到半导体的(粉丝福利,聊聊我的经历)
  • C#编写的Windows体检管理软件源码,含报告生成、皮肤切换与自动升级功能
  • Navicat重置脚本:Mac用户无限试用Navicat的终极解决方案
  • CryptoJS 4.2.0:JavaScript项目中实现专业数据加密的完整指南
  • 构建可预测的对话状态机:ChatGPT对话模拟工程实践
  • 三星K4B2G1646C-HCH9:2Gb DDR3 SDRAM内存颗粒技术规格
  • OmenSuperHub终极指南:轻量级惠普游戏本控制工具完全解析
  • 解决C#串口设备管理难题:一个方法搞定PID/VID匹配,自动找到你的Arduino或STM32开发板
  • 3步实战WeChatMsg:永久保存微信聊天记录,解锁数据价值新维度
  • 5分钟自动化学习方案:智慧树刷课插件助你告别重复操作
  • 2026年燕郊老板不做GEO代运营会怎样?
  • 用Verilog在FPGA上复刻一个复古数字钟:从分频到报时的完整实现
  • Citra模拟器终极配置指南:5个专业技巧解决性能问题
  • 2026年数控机床维修与改造服务市场分析:如何选择可靠的服务商 - 优质品牌商家
  • 闲置黄金变现 邯郸多家正规回收门店测评 - 余生黄金回收