如何使用sizeof计算结构体所占内存大小

1 篇文章 0 订阅
订阅专栏

前言

本博文用于记录学习过程中遇到的难点知识的总结,可能涉及到许多专业内容的非专业表述。请自动忽略,重在理解。

一、各类型变量在不同运行环境中所占内存大小总结

各种变量类型在16、32、64位中所占内存空间大小

二、正文

注:下面所有例子都是在32位环境中运行
在计算结构体字节长度之前,需要明确一个概念,即补齐。简单来说,补齐就是以结构体中最大的变量类型为标准,将不满足该标准的变量类型补齐为满足该标准的变量类型。举个例子,如果结构体中有double和int成员的变量,那么对于int,就要按照double进行补齐,即8+8=16。
在这里插入图片描述我们再引入一个char类型变量:
在这里插入图片描述输出结果仍然是16,这是因为char占1字节,int占4字节,两个加起来只占5字节,用一个8字节的单元足以补齐,所以没必要再加一个单元,仍然是8+8=16。
在这里插入图片描述还是刚才的例子,只不过调整了下顺序,但结果截然不同。这是因为计算机在分配内存时是按照变量定义顺序进行的。也就是说,上例的分配过程如下:char只有1字节,补齐为8字节(假设已知结构体中最大字节长度);double为8字节,不需要补齐;int为4字节,补齐为8字节。所以最终结果为8+8+8=24。所以在定义结构体时,成员变量的定义顺序将直接影响结构体占用内存的大小。
在这里插入图片描述在这里插入图片描述将char类型变量改成指针类型,占用空间由1字节变成4字节,但总空间不变。这是因为即便char *是4,但补齐后仍然为8。

在这里插入图片描述增加一层嵌套定义,这时总长度为24,其运算过程如下:在test2结构体中,char *是4字节,补齐为8字节(因为在test中最大变量类型为double,字节长度为8);进入test,char *是4字节,补齐为8,double是8字节,不需要补齐。因此总长度为8+8+8=24。也就是说,无论我们嵌套多少结构体,我们都可以将其视为一个结构体,将内部的成员结构体中的成员变量展开来,按照变量定义的先后顺序进行计算。
在这里插入图片描述在此基础上增加一个指针类型结构体,发现总长度变为24+8=32。也就是说,对于指针类型结构体,我们不需要将其展开,而是仅仅视作一个指针类型即可。在32位中,指针类型长度就是4,因此按照之前的原则,补齐为8即可。

在这里插入图片描述引入结构体数组。上例计算过程如下:char * 是4字节,补齐为8字节(因为在test中最大变量类型为double,字节长度为8);然后先看test结构体的长度,由上文已经知道长度为16,而这样长的变量有MaxSize(大小为10)个,所以需要乘10。总长度为16×10+8=168。补充一点,如果上述数组定义成test * t[MaxSize]的形式,则视为MaxSize(10)个test * 类型,即为4×10=40字节。这时总字节变成了48。
在这里插入图片描述还有一个特别的指针类型,即结构体自我嵌套定义,这时仍然视作指针类型,长度为4。
到此为止,关于结构体长度的计算已经讲得十分透彻了,最后用一个复杂的结构体作为结束(求sizeof(test3)):
在这里插入图片描述在这里插入图片描述在这里插入图片描述我们按照结构体成员变量的定义顺序进行计算:
第一步,明确两个结构体成员变量的大小,以辅助后续运算。test为8+8=16,test2为8+16×10+8=176。
第二步,按照成员变量定义顺序进行运算。char *为4,补齐为8;单个test2位176,test2数组为176×10=1760;单个test *为4,test *数组为4×10=40;struct test3 *m,结构体自嵌套定义,其本质还是指针类型,长度为4补齐为8。
因此,总长度为8+1760+40+8=1816。
在这里插入图片描述写的不好,如果存在错误的地方,欢迎指正,谢谢!!

使用sizeof 判断一个数据所内存大小
07-25
现在,笔试题目提出了一个挑战,即不使用sizeof来判断一个数据类型所内存大小的方法。这种问题的解决思路一般是依赖于指针和内存地址的运算。具体来说,可以使用一个技巧,即通过获取变量的地址,然后通过该地址...
sizeof()求结构体大小
CHANGE的博客
09-09 359
sizeof结构体
sizeof()计算
u012713968的专栏
01-08 2912
在每年各个公司的笔试题中,有一种典型的问题就是计算sizeof()的大小问题。在这里,我们对这类问题做一个全面的归纳总结,包含如何 计算结构体,位域,数组,字符串,指针,C++中的class等所有内容。 大家在以后遇到这类问题,就应该信心十足了。当然,掌握这些计算,也不全是为了应付面试,更多的能加深对C的理解和掌握。能够进一步应用到平时的程序设计与调试中。 一,基本类型的长度计算 要做
C语言——数组、sizeof关键字
最新发布
weixin_45720999的博客
07-13 891
C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。
sizeof计算大小规则(一看就会)
Winters____的博客
05-08 8510
看了几遍 sizeof 的内容,老是忘记,这里做下笔记,以供复习与参考。 sizeof(a)用来计算a所字节大小,其中a可以是类型名,也可以是变量,亦或是对象。 1) sizeof (int); //类型 2) sizeof (a); //int a;变量 3) sizeof (a); //class A; A a;对象 需要注意的是,sizeof在32位操作系统和64位操作系统中...
全网最详细的sizeof运算和strlen函数讲解(通过多种数据类型举例)
2302_76941579的博客
09-06 1万+
本博客详细介绍了sizeof对基本数据类型、数值型数组、字符数组、字符串的计算,同时也包含了strlen对字符数组和字符串的计算,最后总结了他们之间的区别,也有练习题的链接
C语言:关键字---sizeof计算存储空间)
MQ0522的博客
12-23 1万+
sizeof是一个“披着函数皮的关键字”,是一种单目操作符,绝对不是函数。 一、sizeof 简介 1. 一般形式 sizeof(对象); sizeof(object); 注意:除了数据类型,其他的对象可以不用括号,这也是sizeof不是函数最有力的证明。 2. 功能 返回一个对象在内存中所中的存储空间,以字节为单位计数。 对象包括:变量、基本数据类型、数组、指针和结构体等。 二、sizeof 用法 1. 变量 2. 基本数据类型 3. 数组 4. 指针 5. 结构体 ...
【c语言】 sizeof、strlen计算字符大小长度题目总结概括(详解)
小洁洁
01-20 3362
sizeof可以理解为一个操作符,其作用简单的说就是返回一个对象或者类型所的内存字节数。strlen是一个函数,用来测量字符串实际长度(不包括‘\0’)。sizeof(arr+0)、sizeof(arr)sizeof(*arr)sizeof(&arr[0]+1)strlen(&arr[0]+1)strlen(arr+0)等等
sizeof求struct结构体内存大小的问题
08-08
下面是一些关于`sizeof`和`struct`结构体内存对齐的常见知识点: 1. **成员变量对齐**:编译器会根据每个成员变量的大小和对齐规则进行排列,使得每个成员变量的地址都是其自身大小的整数倍。 2. **填充(Padding...
结构体内存对其计算结构体大小
03-06
本文将深入探讨结构体内的内存对齐规则及其计算结构体大小的方法。 内存对齐的基本原则是,每个变量都存储在特定的地址边界上,这个边界通常是该变量类型的大小。例如,32位系统中,通常整型(int)变量会被对齐到4...
基础电子中的如何计算结构体的大小
11-12
在电子和计算机编程领域,尤其是使用C语言时,理解如何计算结构体的大小是非常重要的基础知识。结构体是一种构造数据类型,允许我们将不同数据类型的变量组合在一起。运算符`sizeof`用于确定任何数据类型或变量据...
C++中类的内存空间大小(sizeof)分析
08-10
首先,对齐是影响类内存大小的关键因素。对齐是指数据在内存中存储时按照特定规则排列,以便提高CPU访问效率。不同的操作系统有不同的对齐策略。在Windows中,通常以结构体中最大内置类型字节数为对齐基准;而在...
使用sizeof()计算结构体大小
热门推荐
92377
09-09 1万+
下面代码的输出结果是: #include <iostream> using namespace std; #pragma pack(4) struct T{ char a; short b; char c; }; #pragma pack() int main() { cout << sizeof(T) << endl; return 0; } A. 4 B. 5 C. 8
sizeof()计算结构体的大小
qq_37659294的博客
03-14 3017
原文链接:sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体sizeof怎么计算 简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题。 一、没有成员的结构体用的空间是多少个字节? 答案是:1个字节。 这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类或空结构体(C+...
sizeof结构体字节大小
qq_30131489的博客
04-26 1890
sizeof结构体字节大小:注意,结构体长度一定是最长的数据元素的整数倍。如 struct{int a;short b;}AA;sizeof(AA) =8;如上结构体中int4个字节,short2个字节,加在一起是6,但不是4的整数倍,取sizeof(AA)=8;...
C语言的sizeof运算符计算结构体大小
小小的星球
04-13 6985
C语言的sizeof运算符运算规则 sizeof运算符 **sizeof 是一个运算符,不是函数(方法)。** 例子: 当想打印一个变量的存储区域大小时,可以直接写 int a = 5; printf("%d\n",sizeof a); 当想打印一个数据类型的存储区域大小时,因为int是数据类型,所以要加小括号提高int的运算优先级 printf("%d\n",sizeof(int)); C中不同数据类型所用的内存大小 对于32位系统来说,大小如下(单位:字节) sizeof计算结构体大小 结构体的成
C语言sizeof函数和指针变量所字节
Dean_Deng的专栏
05-02 8078
一个指针变量到底几个字节?一些预备知识: 首先看一个c语言自带的函数sizeof: sizeof(数据类型) 功能:返回值就是该数据类型所字节数 例子: sizeof(int) = 4; sizeof(char) = 1; sizeof(double) = 8; 还可以写成sizeof(变量名),返回值是该变量所字节
sizeof(结构体)的大小判断
ajin156的博客
02-20 7191
结构体字节数大小的计算(多种情况)
c语言结构体变量内存大小
03-28
给出以下代码: ``` #include <stdio.h> struct test { int a; char b[3]; double c; }; int main() { struct test t; printf("Size of struct test: %lu bytes\n", sizeof(t)); return 0; } ``` 结构体 `test` 中包含一个整型变量 `a`,一个字符数组 `b`,以及一个双精度浮点型变量 `c`。在主函数中声明了一个 `test` 类型的变量 `t`,并输出了变量 `t` 用的内存大小。 根据变量的数据类型和对齐规则,可以计算结构体变量 `t` 用的内存大小为 24 字节(在 64 位机器上)。 解释如下: - 整型变量 `a` 用 4 字节。 - 字符数组 `b` 用 3 字节,但是由于对齐规则,需要补充 1 字节,所以总共用 4 字节。 - 双精度浮点型变量 `c` 用 8 字节。 所以结构体变量 `t` 的总大小为 4 + 4 + 8 = 16 字节。由于对齐规则需要将结构体大小对齐到 8 的倍数,所以最终用的内存大小为 24 字节
写文章

热门文章

  • 谈谈Java与C#的区别 6998
  • ArcGIS Engine:对COM组件的调用返回了错误HRESULT E_FAIL 6684
  • 如何使用sizeof计算结构体所占内存大小 3330
  • Java中只有值传递?一篇文章彻底弄懂 2493
  • 狂神SSM框架总结 344

分类专栏

  • Java 4篇
  • AE开发 1篇
  • C/C++/数据结构 1篇

最新评论

  • 谈谈Java与C#的区别

    天才小网管: C语言问世的时候,中国还在遗失的十年中。。唉。。好可惜那十年

  • Java中只有值传递?一篇文章彻底弄懂

    After_After_Day: 讲的很通透,点赞

最新文章

  • 狂神SSM框架总结
  • 谈谈Java与C#的区别
  • 谈谈对JavaScript中apply方法的理解
2023年2篇
2022年2篇
2021年1篇
2020年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王无锡网站优化咨询融海科技项城网站优化哪家不错怎么优化uc网站排名许昌关键词网站优化哪家便宜网站优化这个工作怎么样手机网站优化费用情况电商网站优化制作齐河网站优化公司怎样写网站有利于优化推广网站模板网站建设推广价格优化广东正规网站关键词优化多少钱禅城网站关键词优化优化网站排名软件峄城网站优化公司绍兴正规的网站seo如何优化沈阳外贸网站优化招聘优化网站网站优化营销推广价格亚马逊网站排名优化网站优化设计岗位职责巩义网站推广优化价格表淮安网站关键词优化公司杭州网站优化排名服务商便捷的网站优化海沧区网站seo优化排名武汉网站推广优化东莞网站优化哪家好化工网站怎么做优化网站标题优化需要重视什么做seo网站优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化