C语言 sizeof

定义

sizeof是C语言的一种单目操作符。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

使用方法

用于数据类型

sizeof(type) 数据类型必须用括号括住

用于变量

sizeof var_name 变量名可以不用括号括住,但是,一般习惯于用括号括住

注意

sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。sizeof(void)都不是正确形式。

字节长度

数据类型所占用字节数与机器字长与编译器有关,遵循的几条规律如下:

  • sizeof(short int )<=sizeof(int)
  • sizeof(int)<=sizeof(long int)
  • short int 至少应为16位(2个字节)
  • long in 至少应为32位(4个字节)

常见字长

  • 16位编译器:char *(指针变量):2个字节(寻址空间为216,所以为两个字节)
  • 32位编译器:char *(指针变量):4个字节
  • 64位编译器:char *(指针变量):8个字节

常见结果

数组

数组所占的内存字节数,包括空字符'\0'

int a[3]; sizeof(a)=3*4=12

char a1[] = "abc"; sizeof(a1)=4,包括空字符

结构体

结构体的字节数由于考虑到字节对齐,因此不仅仅是结构体内部数据的字节数之和这么简单。

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal padding);

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

#include<stdio.h>
struct A {
int a; //art 0 end 3
double b[100]; //original starting position 4 aligned starting position 8 end 101*8-1
char c[3]; //original starting position 101*8 end 101*8+2
_Bool v; //original starting position 101*8+3 end 101*8+3+1/8
//final action align the length of struct,so that 填充字节,使其成为最宽基本类型成员大小的整数倍
}a;
int main() {

struct A a1;
printf("%d\n", sizeof a1);
while (getchar() != '\n');
getchar();
return 0;
}
运行结果:816(102*8)

指针

指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节。指针变量的sizeof值与指针所指的对象没有任何关系。

联合体

结构体在内存组织上市顺序式的,联合体则是重叠式,各成员共享一段内存;所以整个联合体的sizeof也就是每个成员sizeof的最大值。

函数

sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。

对函数求值的形式

sizeof(函数名(实参表))

注意

1)不可以对返回值类型为空的函数求值。

2)不可以对函数名求值。

3)对有参数的函数,在用sizeof时,须写上实参表。

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

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

相关文章

Lua教程

Lua教程(简单易懂)-CSDN博客 博客相关解释&#xff1a; 5、循环 a {"a", "b"}for i, v in ipairs(a) doprint(i, v)end 代码创建了一个名为 a 的数组&#xff0c;并使用 ipairs 迭代这个数组的元素。运行结果显示了每个元素的索引&#xff08;下标&am…

ubuntu20.04 vins-fusion 运行记录

过程记录 环境&#xff1a; ubuntu20.04 opencv4.2.0(此次使用) 3.3.1(其他程序在使用) vins-fusion vision_opencv 1.下载VINS-Fusion和cv_bridge&#xff0c;并进行修改&#xff0c;方便使用opencv4.2.0和对应的cv_bridge。 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src…

C++数位动态规划算法:统计整数数目

题目 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2 min_sum < digit_sum(x) < max_sum. 请你返回好整数的数目。答案可能很大&…

【Linux】基本指令-入门级文件操作(二)

目录 基本指令 7 cp指令&#xff08;重要&#xff09; 8 mv指令&#xff08;重要&#xff09; 9 nano指令 10 cat指令 11 echo指令与重定向&#xff08;重要&#xff09; 12 more指令 13 less指令 基本指令 7 cp指令&#xff08;重要&#xff09; 功能&#xff1a;复…

redis如何实现缓存预热

在业务系统中&#xff0c;我们需要在程序启动的时候加载一些常用的数据到内存数据库中&#xff0c;从而减少业务数据库的压力。这就是我们常提到的缓存预热。官方一点的解释是这样的&#xff1a; 缓存预热是一种在程序启动或缓存失效之后&#xff0c;主动将热点数据加载到缓存中…

注意力屏蔽(Attention Masking)在Transformer中的作用 【gpt学习记录】

填充遮挡&#xff08;Padding Masking&#xff09;&#xff1a; 未来遮挡&#xff08;Future Masking&#xff09;&#xff1a;

09. 机器学习- 逻辑回归

文章目录 线性回归回顾逻辑回归 Hi&#xff0c;你好。我是茶桁。 上一节课&#xff0c;在结尾的时候咱们预约了这节课一开始对上一节课的内容进行一个回顾&#xff0c;并且预告了这节课内容主要是「逻辑回归」&#xff0c;那我们现在就开始吧。 线性回归回顾 在上一节课中&a…

如何处理接口调用的频率限制

背景 接口提供方有调用频率限制的场景下&#xff0c;如何合理设计接口请求? 方案 采用Redis队列&#xff0c;利用 lpush 和 rpop 命令来实现 首先&#xff0c;将订单依次lpush写入Redis队列。定时任务通过 rpop 获取队列订单进行接口调用。 额外说明&#xff1a; 若想查看…

flutter问题汇总

一直卡在building a flutter app for general distribution&#xff1b; AS Message窗口显示 依赖下载失败&#xff1a; 1、修改仓库地址的配置&#xff1a;android/build.gradle repositories {maven { url https://download.flutter.io }maven { url "https://maven.a…

ubuntu如何查看系统信息、cpu型号

查看当前操作系统内核信息 uname -a输出&#xff1a; Linux htu-H110M-S2 5.4.0-148-generic #165~18.04.1-Ubuntu SMP Thu Apr 20 01:14:06 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 查看当前操作系统发行版信息 cat /etc/issueUbuntu 18.04.6 LTS \n \l 查看cpu型号 c…

Go语言入门心法(一)

Go语言入门心法(一) Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 一: go语言中变量认知 go语言中变量的定义: &#xff08;要想飞|先会走&#xff09;||&#xff08;翻身仗|抹遗憾 &#xff09; |&#xff08;二八定律&#xff09;(先量变)|(再质变)||&#x…

【Matlab】二维绘图函数汇总

目录 1. plot() 2. subplot() 3. fplot() 4. polarplot() 1. plot() plot() 函数是 Matlab 中最常用的绘图函数&#xff0c;用于在平面直角坐标系中绘制直线或曲线。 用法&#xff1a; plot(X,Y) plot(X,Y,LineSpec) plot(X1,Y1, ... ,Xn,Yn) 说明&#xff1a; plot(X,Y) …

Ubuntu下安装Python

Ubuntu下安装Python 预备知识一、Python安装Python 二、Anaconda安装Anaconda卸载Anaconda 三、Miniconda安装Miniconda 四、异同比较 预备知识 (1) Python是一种编程语言。 (2) Anaconda是一款包管理工具&#xff0c;用来管理Python及其他语言的安装包&#xff0c;预装了很多…

Unity实现经验光照模型

漫反射&#xff1a; Lambert: 公式&#xff1a; //diffuse ambient _parm*lightcolor* max(0, Dot(N,L)) fixed4 frag (v2f i) : SV_Target{//diffuse ambient _parm*lightcolor* max(0, Dot(N,L))fixed3 ambient unity_AmbientSky;fixed3 N normalize(i.worldNormal)…

RackNerd 圣何塞 VPS 测评

发布于 2023-07-06 on https://chenhaotian.top/vps/racknerd-ca/ RackNerd 圣何塞 VPS 测评 官网链接&#xff1a;https://my.racknerd.com/index.php?rp/store/kvm-vps 这款是2022年双十一特别款&#xff0c;现在已经买不到了 网络是G口&#xff0c;4T流量 稳定性不错&…

【考研408真题】2022年408数据结构41题---判断当前顺序存储结构树是否是二叉搜索树

文章目录 思路408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 思路 很明显&#xff0c;这是一个顺序存储结构的树的构成方法。其中树的根节点位置从索引0开始&#xff0c;对于该结构&#xff0c;存在有&#xff1a;如果当前根节点的下标为n&#xff0c…

获取本地缓存数据修改后,本地缓存中的值也修改问题

获取本地缓存数据修改后&#xff0c;本地缓存中的值也修改问题 JAVA缓存&#xff0c;获取数据后修改&#xff0c;缓存中的数值也会修改&#xff0c;解决方法是创建新的对象再修改值比如使用BeanUtils.copyProperties()方法。如果值是List&#xff0c;可以使用两种方法解决循环…

凉鞋的 Unity 笔记 108. 第二个通识:增删改查

在这一篇&#xff0c;我们来学习此教程的第二个通识&#xff0c;即&#xff1a;增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景层次窗口中&#xff0c;我们是对 GameObject 进行增删改查。 在 Project 文件窗口中&#xff0c;我们是对文件&文件夹进行增删…

Jetpack:007-Kotlin中的Button

文章目录 1. 概念介绍2. 使用方法2.1 Button2.2 IconButton2.3 ElevatedButton2.4 OutlinedButton2.5 TextButton2.6 FloatingActionButton 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中输入框相关的内容&#xff0c;本章回中将要介绍 Button。闲话休提&#xff0…

使用【Blob、Base64】两种方式显示【文本、图片、视频】 使用 video 组件播放视频

Blob 显示 Blob 对象的类型是由 MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;来确定的。MIME 类型是一种标准&#xff0c;用于表示文档、图像、音频、视频等多媒体文件的类型。以下是一些常见的 Blob 对象类型&#xff1a; text/plain&#xff1…