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

C 语言: sizeof 运算符深度解析

目录

引言

一、sizeof 的基本概念

二、sizeof 与数据类型

三、sizeof 与数组

四、sizeof 与结构体

五、sizeof 的应用场景

六、总结


 

 

引言

b195944e5ca4463dad121c855adda2a5.png

在 C 语言的学习和应用中,sizeof运算符是一个非常重要的工具。它能够帮助我们确定数据类型和变量在内存中所占的字节数,对于理解内存管理和优化程序性能有着至关重要的作用。本文将深入探讨 C 语言中sizeof运算符的各种特性和用法。

 

一、sizeof 的基本概念

sizeof是 C 语言中的一个运算符,用于计算操作数所占用的内存字节数。它可以作用于各种数据类型、变量、数组以及结构体等。

例如:


int a;

printf("Size of int: %zu\n", sizeof(int));

printf("Size of variable a: %zu\n", sizeof(a));

在上面的代码中,sizeof(int)返回int类型所占用的字节数,而sizeof(a)则返回变量a所占用的字节数。

 

二、sizeof 与数据类型

不同的数据类型在内存中占用的字节数是不同的。sizeof可以帮助我们确定各种数据类型的大小。

基本数据类型

    • char:通常占用 1 个字节。
    • int:在不同的编译器和系统中可能有所不同,一般为 2 个或 4 个字节。
    • float:通常为 4 个字节。
    • double:通常为 8 个字节。

例如:


printf("Size of char: %zu\n", sizeof(char));

printf("Size of int: %zu\n", sizeof(int));

printf("Size of float: %zu\n", sizeof(float));

printf("Size of double: %zu\n", sizeof(double));

指针类型

    • 指针变量在不同的系统中占用的字节数也可能不同,一般为 4 个或 8 个字节,取决于系统的寻址能力。

例如:


int* ptr;

printf("Size of pointer to int: %zu\n", sizeof(ptr));

 

三、sizeof 与数组

数组大小的计算

    • 对于一维数组,sizeof可以计算出整个数组所占用的字节数。
    • 数组大小等于数组元素个数乘以每个元素的大小。

例如:


int arr[5];

printf("Size of array arr: %zu\n", sizeof(arr));

数组名与 sizeof

    • 在大多数情况下,数组名会被转换为指向数组第一个元素的指针。但在sizeof运算符中,数组名表示整个数组

例如:


int arr[5];

printf("Size of pointer to array: %zu\n", sizeof(&arr));

printf("Size of array: %zu\n", sizeof(arr));

四、sizeof 与结构体

结构体大小的计算

    • 结构体的大小是其成员变量大小之和,但由于内存对齐的原因,实际大小可能会大于成员变量大小之和。
    • 内存对齐是为了提高内存访问效率。

例如:


struct MyStruct {

char a;

int b;

char c;

};

printf("Size of struct MyStruct: %zu\n", sizeof(struct MyStruct));

#pragma pack指令

    • 可以使用#pragma pack指令来控制结构体的内存对齐方式。

例如:


#pragma pack(1)

struct MyStruct {

char a;

int b;

char c;

};

#pragma pack()

printf("Size of packed struct MyStruct: %zu\n", sizeof(struct MyStruct));

五、sizeof 的应用场景

动态内存分配

    • 在使用malloc等函数进行动态内存分配时,sizeof可以帮助我们确定需要分配的内存大小。

例如:


int* ptr = (int*)malloc(sizeof(int) * 10);

缓冲区大小的确定

    • 在处理文件输入输出或网络通信时,sizeof可以用于确定缓冲区的大小。

例如:


char buffer[1024];

// 使用 buffer 进行文件读取或网络通信

printf("Size of buffer: %zu\n", sizeof(buffer));

跨平台编程

    • 由于不同的系统和编译器可能对数据类型的大小有不同的定义,使用sizeof可以确保程序在不同平台上的正确性。

例如:


#if defined(_WIN32)

// Windows 平台下的代码

#elif defined(__linux__)

// Linux 平台下的代码

#else

// 其他平台下的代码

#endif

printf("Size of int on this platform: %zu\n", sizeof(int));

六、总结

sizeof运算符在 C 语言中是一个非常强大的工具,它可以帮助我们了解数据类型和变量在内存中的大小,对于内存管理、优化程序性能以及跨平台编程都有着重要的意义。通过深入理解sizeof的各种特性和用法,我们可以更好地掌握 C 语言的内存管理机制,编写出更加高效和可靠的程序。

 


http://www.kler.cn/a/445310.html

相关文章:

  • 小程序基础 —— 08 文件和目录结构
  • 【VulnOSv2靶场渗透】
  • C++ 设计模式:单例模式(Singleton Pattern)
  • C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
  • Ftrace: 深入探究Linux内核的追踪利器
  • OpenCV-Python实战(11)——边缘检测
  • 【PGCCC】Postgresql Varlena 结构
  • bicycle 和cycle区别及使用场景
  • 线上虚拟展厅支持哪些类型的素材添加?
  • 农村的PCDN
  • Mysql语法之DQL查询的多行函数
  • 电子应用设计方案-62:智能鞋柜系统方案设计
  • ChromeOS 131 版本更新
  • * 和 .* 的区别(MATLAB)
  • redis数据类型:list
  • SpringCloud无介绍快使用,sentinel注解@SentinelResource的基本使用(二十三)
  • HTTP 常见的请求头有哪些? 作用?常见的使用场景都有哪些?
  • python 中使用pip操作flask离线下载(包含依赖包下载)和安装
  • 排序概述及Python实现
  • 玩转OCR | 探索腾讯云智能结构化识别新境界
  • Deepin/Linux clash TUN模式不起作用,因网关导致的问题的解决方案。
  • 智能座舱进阶-应用框架层-Jetpack主要组件
  • Python 爱心代码实现动态爱心图案展示
  • Elasticsearch8.17.0在mac上的安装
  • MLM: 掩码语言模型的预训练任务
  • 3138. 同位字符串连接的最小长度