C语言中,sizeof关键字(详细介绍)

目录

    • ‌1. 基本用法‌
      • (1) ‌基本数据类型‌
      • (2) ‌变量‌
      • (3) ‌数组‌
      • (4) ‌指针‌
    • ‌2. 特殊用法‌
      • (1) ‌结构体与内存对齐‌
      • (2) ‌动态内存分配‌
      • (3) ‌表达式‌
    • ‌3. 注意事项‌
      • ‌1)sizeof 与 strlen 的区别‌:
      • ‌2)变长数组(VLA)‌:
      • ‌3)不要误用‌:
    • ‌4. 常见问题示例‌
      • (1) ‌指针与数组的混淆‌
      • (2) ‌结构体内存对齐‌

在C语言中,sizeof 是一个‌ 编译时运算符‌,用于计算变量、数据类型或表达式在 内存中所占的‌字节数‌。它不是一个函数, 不需要在运行时执行,且 结果是编译时确定的常量(除非操作数是变长数组,VLA)。

‌1. 基本用法‌

(1) ‌基本数据类型‌

printf("int 大小: %zu\n", sizeof(int));       // 通常为4字节(32/64位系统)
printf("char 大小: %zu\n", sizeof(char));     // 固定为1字节
printf("double 大小: %zu\n", sizeof(double)); // 通常为8字节

(2) ‌变量‌

int a = 10;
double b;
printf("变量a的大小: %zu\n", sizeof(a));  // 等价于 sizeof(int)
printf("变量b的大小: %zu\n", sizeof b);   // 括号可省略(仅对变量)

(3) ‌数组‌

计算整个数组的总字节数:

int arr[10];
printf("数组总大小: %zu\n", sizeof(arr)); // 10 * sizeof(int)

计算数组元素个数:

int len = sizeof(arr) / sizeof(arr[0]); // 10

(4) ‌指针‌

指针的大小与指向的数据类型无关,仅取决于系统架构:

int *p;
char *str;
printf("指针p的大小: %zu\n", sizeof(p));    // 32位系统为4字节,64位系统为8字节
printf("指针str的大小: %zu\n", sizeof(str)); // 同上

‌2. 特殊用法‌

(1) ‌结构体与内存对齐‌

结构体的大小可能因内存对齐规则而大于成员大小的简单相加:

struct Example {char c;    // 1字节(对齐到4字节)int i;     // 4字节double d;  // 8字节
};
printf("结构体大小: %zu\n", sizeof(struct Example)); 
// 输出可能是 1 + 3(填充) +4 +8 = 16字节(对齐到8字节边界)

(2) ‌动态内存分配‌

sizeof 无法直接获取动态分配内存的大小:

int *p = malloc(10 * sizeof(int));
printf("p的大小: %zu\n", sizeof(p)); // 输出指针的大小(如8字节),而非分配的内存大小!

(3) ‌表达式‌

计算表达式结果类型的字节数(表达式不会被执行):

int x = 0;
printf("表达式大小: %zu\n", sizeof(x + 3.14)); // 等价于 sizeof(double)

‌3. 注意事项‌

‌1)sizeof 与 strlen 的区别‌:

  • sizeof 计算内存大小(包括字符串的终止符 \0);
  • strlen 计算字符串长度(不包含 \0)。
char str[] = "hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 输出6(5字符 + \0)
printf("strlen(str): %zu\n", strlen(str)); // 输出5

‌2)变长数组(VLA)‌:

C99支持变长数组,此时 sizeof 的结果在运行时计算:

int n = 10;
int vla[n];
printf("VLA大小: %zu\n", sizeof(vla)); // 输出10 * sizeof(int)
‌类型转换‌:
sizeof 的结果类型是 size_t(无符号整数),打印时使用 %zu:printf("size_t大小: %zu\n", sizeof(size_t)); // 通常为8(64位系统)

‌3)不要误用‌:

  • sizeof(指针) 返回指针的大小,而非指向数据的大小!
  • sizeof 无法获取动态数组或堆内存的实际大小。

‌4. 常见问题示例‌

(1) ‌指针与数组的混淆‌

void func(int arr[]) {// arr 退化为指针!printf("函数内数组大小: %zu\n", sizeof(arr)); // 输出指针大小(如8字节)
}int main() {int arr[10];printf("main中数组大小: %zu\n", sizeof(arr)); // 输出40(假设int为4字节)func(arr);
}

(2) ‌结构体内存对齐‌

struct A {char a;     // 1字节int b;      // 4字节(对齐到4字节边界)short c;    // 2字节(对齐到2字节边界)
};
// 总大小:1 + 3(填充) +4 +2 +2(填充) = 12字节(对齐到4字节)
printf("struct A大小: %zu\n", sizeof(struct A)); 

‌总结‌

‌用法‌示例‌‌说明‌
基本类型大小sizeof(int)返回类型的字节数
变量大小sizeof(a)等价于变量类型的 sizeof
数组总大小sizeof(arr)数组元素个数 × 单个元素大小
指针大小sizeof(int*)取决于系统架构(4或8字节)
结构体大小sizeof(struct Example)考虑内存对齐规则

合理使用 sizeof 可以避免硬编码数据类型大小,增强代码的可移植性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADK 第三篇 Agents (LlmAgent)

Agents 在智能体开发套件(ADK)中,智能体(Agent)是一个独立的执行单元,旨在自主行动以实现特定目标。智能体能够执行任务、与用户交互、使用外部工具,并与其他智能体协同工作。 在ADK中&#x…

【深度学习】典型的 CNN 网络

目录 一、LeNet-5 (1)LeNet-5 网络概览 (2)网络结构详解 (3)关键组件与数学原理 3.1 局部感受野与卷积运算 3.2 权重共享 3.3 子采样(Pooling) 3.4 激活函数 (4…

4.8/Q1,中山大学用NHANES:膳食烟酸摄入量与非酒精性脂肪肝之间的关联

文章题目:Association between Dietary Niacin Intake and Nonalcoholic Fatty Liver Disease: NHANES 2003-2018 DOI:10.3390/nu15194128 中文标题:膳食烟酸摄入量与非酒精性脂肪肝之间的关联:NHANES 2003-2018 发表杂志&#xf…

高效管理远程服务器Termius for Mac 保姆级教程

以下是 Termius for Mac 保姆级教程,涵盖安装配置、核心功能、实战案例及常见问题解决方案,助你高效管理远程服务器(如Vultr、AWS等)。 一、Termius 基础介绍 1. Termius 是什么? 跨平台SSH客户端:支持Ma…

理解数学概念——支集(支持)(support)

1. 支集(support)的定义 在数学中,一个实函数 f 的支集(support)是函数的不被映射到 0 的元素域(即定义域)的子集。若 f 的(定义)域(domain)是一个拓扑空间(即符合拓扑的集合),则 f 的支集则定义为包含( f 的元素域中)不被映射到0的所有点之最小闭集…

Vue 3 Element Plus 浏览器使用例子

Element Plus 是一个基于 Vue 3 的流行开源 UI 库,提供了一系列的组件,帮助开发者快速构建现代化的用户界面。它的设计简洁、现代,包含了许多可定制的组件,如按钮、表格、表单、对话框等,适合用于开发各种 Web 应用。 …

SSR vs SSG:前端渲染模式终极对决(附 Next.js/Nuxt.js 实战案例)

一、引言:前端渲染模式的进化之路 随着互联网的发展,用户对于网页的加载速度和交互体验要求越来越高。前端渲染技术作为影响网页性能的关键因素,也在不断地发展和演进。从最初的客户端渲染(CSR),到后来的服…

算法笔记.分解质因数

代码实现&#xff1a; #include<iostream> using namespace std; void breakdown(int x) {int t x;for(int i 2;i < x/i;i){if(t%i 0){int counts 0;while(t % i 0){t/i;counts;}cout << i <<" "<< counts<<endl;}}if(t >…

CUDA Error: the provided PTX was compiled with an unsupported toolchain

CUDA程序编译时生成的PTX代码与系统上的CUDA驱动版本不兼容 CUDA 编译器版本&#xff1a; CUDA 12.6 (nvcc 编译器版本) CUDA 驱动版本&#xff1a; CUDA 12.3 (nvidia-smi 驱动版本) 解决方法&#xff1a; 驱动版本下载参考&#xff1a;Your connected workspace for wiki…

计算机组成原理实验(7) 堆指令部件模块实验

实验七 堆指令部件模块实验 一、实验目的 1、掌握指令部件的组成方式。 2、熟悉指令寄存器的打入操作&#xff0c;PC计数器的设置和加1操作&#xff0c;理解跳转指令的实现过程。 二、实验要求 按照实验步骤完成实验项目&#xff0c;掌握数据打入指令寄存器IR1、PC计数器的…

2022 年 6 月大学英语四级考试真题(第 2 套)——阅读版——仔细阅读题

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…

磁盘文件系统

磁盘文件系统 一、磁盘结构1.1 认识一下基础的硬件设备以及真实的机房环境1.2 磁盘物理结构与存储结构1、磁盘物理结构2、磁盘的存储结构3、CHS地址定位4、磁盘的逻辑结构&#xff08;LBA&#xff09;5 磁盘真实过程5 CHS && LBA地址 二、理解分区、格式化1 引⼊"…

基于LangChain 实现 Advanced RAG-后检索优化(下)-上下文压缩与过滤

摘要 Advanced RAG 的后检索优化&#xff0c;是指在检索环节完成后、最终响应生成前&#xff0c;通过一系列策略与技术对检索结果进行深度处理&#xff0c;旨在显著提升生成内容的相关性与质量。在这些优化手段中&#xff0c;上文压缩与过滤技术是提升检索结果质量的重要手段。…

为什么 Vite 速度比 Webpack 快?

一、webpack会先进行编译&#xff0c;再运行&#xff0c;vite会直接启动&#xff0c;再按需编译文件。 首先看两张图&#xff0c;可以清晰的看到&#xff0c;上面的图是webpack编译过的&#xff0c;而下面的图是vite直接使用工程内文件。 二、区别于Webpack先打包的方式&am…

C# 操作符

C# 操作符 一、操作符概览二、优先级与运算顺序三、各类操作符的实例 一、操作符概览 操作符&#xff08;运算符&#xff09;的本质是函数的简记法 操作符不能脱离与它关联的数据类型 int x 5; int y 4; int z x / y; Console.WriteLine(z);//输出1double a 5.0; double b…

C++设计模式:面向对象的八大设计原则之四

里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它指出子类必须能够替换它的基类&#xff0c;并且程序的行为不会发生改变。也就是说&#xff0c;在任何使用基类对象的地方&#xff0c;都可以透…

网络通信领域的基础或流行协议

一、TCP(传输控制协议) 1. 宏观介绍 TCP:全称“Transmission Control Protocol”——传输控制协议,是互联网最基础的传输协议之一。传输层协议,提供面向连接、可靠的字节流传输服务。它通过三次握手建立连接、四次挥手断开连接,确保数据有序、完整地传输作用:让两个设备…

【教学类-34-10】20250503(通义万相)4*3蝴蝶拼图(圆形、三角、正方、半圆的凹凸小块+参考图灰色)

背景需求 2023年从网站上搜索拼图代码,陆续改良了圆形、三角形、菱形凹凸) 【教学类-34-05】20230425拼图(“圆角”凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)_拼图的槽叫什么形状-CSDN博客文章浏览阅读1.1k次。【教学类-34-05】20230425拼图(“圆角”凹凸拼图)…

bellard.org‌ : QuickJS 如何使用 qjs 执行 js 脚本

参阅上一篇&#xff1a;Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;介绍 Fabrice Bellard&#xff08;个人网站&#xff1a;‌bellard.org‌&#xff09;是计算机领域最具影响力的程序员之一&#xff0c;其贡献跨越多个技术领域并持续推动开…

数据结构---

案例一 1.随机生成n个工人工时&#xff0c;100以内&#xff0c;工号分别为2021101到2021100n 2.以工时数为关键字分别使用选择排序、冒泡排序、插入排序进行升序排序。 3.把排序后的结果输出&#xff0c;包括工号工时数 4.比较三种算法对相同的n值数组排序所花的时间 代码如下&…