C 语言 sizeof 完全用法指南

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

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


一、两种基本用法

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

格式:sizeof(类型名)适用于:int、char、float、double、结构体、指针等所有 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. 不执行表达式,编译期确定大小
相关推荐
听风说ml8 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
学逆向的10 小时前
C 局部静态变量
c语言·开发语言·网络安全
UIU11410 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi11 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院13 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng13 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋15 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~15 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归