首页 > 系统相关 >结构体内存,大小,联合,位域

结构体内存,大小,联合,位域

时间:2023-02-27 22:59:14浏览次数:62  
标签:20 字节 int char 地址 联合 位域 bit 体内

C语言中结构体内存分配(内含数组与结构体版)----超级详细版_Abyssal丶Sun的博客-CSDN博客_c语言结构体内存分配参考

 

结构体地址内存是自增的,

我们所知一个地址的内存能存储1字节



struct  student
{
   uint8_t  name;
   uint8_t a;
   uint8_t b;       
};
struct student stu;
printf("%d\r\n",sizeof(stu))
printf("%d,%d,%d",&stu.name,&stu.a,&stu.b);
结构体大小 //这个结构体最长的基本单位是8位,为1字节 name为结构体首地址没有偏移,内存大小为1字节,是1字节的整数倍; a也是1字节, b也是1字节 所以是1+1+1 = 3字节
结构体地址
//以上的结果就是b的地址比a的地址大1,a比name的地址大1

当把上面的uint8_t替换成uint16_t的类型是,输出的结果就会是
b比a大2,a比name大2;
原因是一个内存存放的是8位数据,uint16_t是16位,所以地址加1内存不够所以地址加2
struct student {
char a[3];
char b[20];
char c;
double d;
char e;
}
求长度 sizeof(struct student)

//此结构体最长的基本单位是double,为8字节
a是数组,char为1字节,首地址没有偏移,a内存为3
数组b的字节数为20,与前面相加为20+3 = 23不是8的倍数所以空出一个字节+1所以到b处总共是24字节
但是char  c为1字节刚好能填补b处空出的一个字节,由于c补充过去,所以到char c总共是24字节,尽管c的1字节补充过去只是数据对齐,地址依旧在b【20】的地址上+1
double d 为8字节8的整数倍,
char e为1字节不是8的整数倍,补充到8的最小整数倍,所以char e 的所占字节为8.
所以总字节为24+8+8 = 40个字节

 

例2struct student {
char a[3];
char b[20];
int c;
double d;
char e;
}
求长度 sizeof(struct student)
最大毕本单位double 8字节
a是数组,char为1字节,首地址没有偏移,a内存为3
数组b的字节数为20,与前面相加为20+3 = 23不是8的倍数所以空出一个字节+1所以到b处总共是24字节
int c为4字节,b处空下的一字节不够4字节填充所以在申请4字节,但是由于4字节不是8的整数倍,所以空出4字节为8字节
double d 8>4填充不了,所以为8字节
char e 1字节不够8字节,补充8字节
所以总数为8+24+8+8 = 48
联合体(共用体)大小计算
union abc
{
  char a;//1字节
  int b;//4字节
}
所以结构体大小为4字节
联合体成员共用一块空间,所以内存空间至少为最大成员大小


union abc
{
char a[5];//对齐数为 为1,占用5字节
int  b;//对齐数为4,占用4字节
}
对齐数4>1,4是最大对齐数,5不是4的倍数,空掉3个byte所以大小为8字节

联合体大小是最大对齐数的整数倍

位域

#include<stdio.h>

struct A
{
//一开始会创建一个int类型的存储空间,4byte = 32bit
//_a会用掉2个bit
int _a : 2;//_a成员占2个bit位
//_b会用掉5个bit
int _b : 5;//_b成员占5个bit位
//_c会用掉10bit
int _c : 10;//_c成员占10个bit位
//_d需要30个bit,但上面只剩下15个bit,所以会再创建4byte的空间
int _d : 30;//_d成员占30个bit位
//所以总共大小是8byte
};
int main()
{
printf("%d\n", sizeof(struct A));
return 0;
}

 参考(39条消息) C语言#(结构体、位段、枚举、联合体(共用体))_guaiwu_的博客-CSDN博客

标签:20,字节,int,char,地址,联合,位域,bit,体内
From: https://www.cnblogs.com/mokongking/p/17162265.html

相关文章

  • 2021 联合省选 A 卷题解
    比2022小清新了许多。卡牌游戏首先可以知道的是按照\(a\)升序排序,肯定有一段区间的\(a\)全保留,然后剩下的全翻面。那么我们需要求出最长的这段区间是什么。首先......
  • MySQL联合索引的创建规则
    1、索引应该按照最常用于查询的列的顺序创建。这样可以最大程度地提高查询性能。2、如果查询中包含的列与索引中的列顺序不一致,则无法使用索引。因此,如果您有多个查询,每个......
  • TypeScript 联合类型
    TypeScript联合类型联合类型(UnionTypes)可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。注意:只能赋值指定的类型,如果赋值其它类型就会报错。创建......
  • 三分钟获取开源微服务项目的具体内容
    在数字管理越来越规范化的今天,开源微服务项目成为了各大企业实现高效办公协作效率的得力助手。那么,什么是开源微服务项目?为了帮助大家获取相关的知识,流辰信息低代码服务商......
  • 【C语言】结构体自己引用、结构体内存、结构体对齐规则。
    ......
  • PostgreSQL update set from 两表联合更新
    updatet_businesstbsetsystem_id=ir.application_idfromt_business_irregularirwheretb.affected_business=ir.application_nameupdatet_businesstbsetsyst......
  • Hibernate annotation 联合主键
    Hibernateannotation联合主键  packagecom.hibernate.entity;importjava.io.Serializable;importjavax.persistence.Entity;importjavax.persistence.GeneratedValu......
  • 软件教程-使用Quartus+ModelSim联合仿真
    最后修改日期:2023/02/17本文前提是用VerilogTestbench文件(.vt)仿真。相较于波形仿真而言,此方法较为通用。下面以QuartusPrime18.0Standard+MentorGraphicsMod......
  • 7. 联合登录和信任登录
    7.1什么是联合登陆联合登录指同时包含多种凭证校验的登录服务,同时,也可以理解为使用第三方凭证进行校验的登录服务。通俗点讲:对于两个网站A和B,在登录A网站的时候......
  • C++中的结构体内嵌比较函数
    概述结构体内嵌比较函数有两种比较常见的应用场合:sort()和优先队列priority_queue<>其中,sort默认从小到大排序,优先队列从大到小排序,要改变默认的次序,必须上比较函数壹个栗......