首页 > 系统相关 >结构体变量的定义和初始化、结构体内存对齐——《初学C语言第44天》

结构体变量的定义和初始化、结构体内存对齐——《初学C语言第44天》

时间:2023-12-31 10:32:27浏览次数:31  
标签:struct int 44 C语言 char 对齐 S1 结构

//////5.——————结构体变量的定义和初始化

////——定义

////方式1

//struct Point

//{

// int x;

// int y;

//}p1;//声明类型的同时定义变量p1

////方式2

//struct Point

//{

// int x;

// int y;

//};

//int main()

//{

// struct Point p2;//定义结构体变量p2

// return 0;

//}

////——初始化

////定义变量的同时赋初始值

//struct Point p3={x,y};

////或

//struct Stu//类型声明

//{

// char name[20];

// int age[5];

//}s1 = {"wangkai",22};//初始化

//int main()

//{

// struct Stu s2 = {"zahngjie",20};//初始化

// return 0;

//}

////嵌套结构体的声明

//#include<stdio.h>

//struct Point

//{

// int n;

// char ch;

//};

//struct score

//{

// int n;

// char ch;

//};

//struct Stu

//{

// char name[20];

// int age;

// struct score s;

//};

//int main()

//{

// struct Point p2 = {3,4};

// struct Stu s1 = { "zhangsan",22,{100,'q'}};

// //s1里包含s,初始化s1时,由于s也是结构体,且结构体初始化要用{},所以{}嵌套初始化

// printf("%s %d %d %c\n",s1.name,s1.age,s1.s.n,s1.s.ch);

// return 0;

//}



//////6.————结构体内存对齐

////如何计算结构体大小?

////首先得掌握结构体的对齐规则:(需画图)

////1. 第一个成员在与结构体变量偏移量为0的地址处。偏移量为整数

////2. 其他成员变量要对齐到对齐数的整数倍的地址处(可以是1倍)。

////    对齐数 = 编译器默认的一个对齐数 与 该成员大小中的较小值。(VS中默认的对齐数为8,gcc编译器无对齐数)

////     编译器无对齐数默认值时,对齐数就用该成员的对齐数

////3. 结构体总大小为最大对齐数(每个成员变量的对齐数进行比较得出的最大的数)的整数倍。

////4. 如果处于嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处(不可占用已被使用的对齐数(偏移量)),

////   结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

////偏移量计算方法:// 借助宏(macor),头文件为:<stddef.h>

////offsetof()——offsetof(type,member):可以返回一个结构体成员在这个类型(type)创建的变量中的偏移量

//#include<stdio.h>

//#include<stddef.h>

//struct S1

//{

// char c1;

// int i;

// char c2;

//};

//struct S2

//{

// char c1;

// char c2;

// int i;

//};

//int main()

//{

// struct S1 s1;

// struct S2 s2;

// printf("%d\n",offsetof(struct S1,c1));//0

// printf("%d\n", offsetof(struct S1, c2));//8

// printf("%d\n", offsetof(struct S1, i));//4

// printf("%d\n",sizeof(struct S1));//12

// printf("%d\n", sizeof(struct S2));//8

// return 0;

//}

////——含嵌套结构体的结构体怎么计算大小?

//struct S1

//{

// char n;

// int b;

// char m;

//};

//struct S2

//{

// char c;

// char k;

// int a;

//};

//struct S3

//{

// double a;

// char b;

// int c;

//};

//struct S4

//{

// char c1;

// struct S3 s3;//嵌套一个结构体

// int i;

//};

//int main()

//{

// printf("%d\n",sizeof(struct S4));

// return 0;

//}



////////为什么存在内存对齐?

////1. 平台原因(移植原因):

////不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特

////定类型的数据,否则抛出硬件异常。

////2. 性能原因:

////数据结构(尤其是栈)应该尽可能地在自然边界上对齐(对其边界:对齐数的整数倍)。

////原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

////(假设在32位的环境下,总共为4字节,4*8个比特位。并且计算机一次可以读写4个字节的内容。)

////举例说明:

//struct S1

//{

// char c;//占一个字节

// int i;//占四个字节

// int n;//占四个字节

//};

////由于每次访问四个字节,所以我们考虑两种存放方法:每个数字便是一次访问,每次四个字节,@:表示空白位置

////1.未对齐的存放(紧挨着存放,节省空间,但是浪费时间):             1.c i1 i2 i3    2.i4 n1 n2 n3  3.n4 @  @  @

////2.已对齐的存放(按照结构体内存对齐要求存放,浪费空间,但节省时间):1.c @   @  @    2.i1 i2 i3 i4  3.n1 n2 n3 n4



////总体来说:

////结构体的内存对齐是拿空间来换取时间的做法。

////那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

////让占用空间小的成员尽量集中在一起。

//struct S1

//{

// char c1;

// int i;

// char c2;

//};

//struct S2

//{

// char c1;

// char c2;

// int i;

//};

////s2更加节省空间

标签:struct,int,44,C语言,char,对齐,S1,结构
From: https://blog.51cto.com/KKhahaha/9046816

相关文章

  • C语言实现井字棋
    首先简述一下:九宫格的棋盘,连成三个连续的即为胜现在拆分三子棋的步骤(1)打印菜单,1开始0退出(2)初始化棋盘(3)打印棋盘(4)玩家下棋,子为’*’(5)判断(6)电脑下棋,为‘#’(7)判断(8)返回步骤三现在分析过后,对其进行编写写game.h(头文件)game.c(游戏主体,函数文件) test.c(测试)我们创建的棋盘大致为下边......
  • C语言小案例
    二维数组输出题目描述:输入一个整数N,输出一个N行N列的二维矩阵,矩阵中的元素用\1~N*N顺序螺旋填充。输入格式一个整数N(N<=10)输出格式输出N行N列的矩阵,元素之间用一个空格隔开,行末不要有多余的空格。样例输入数据3输出数据123894765代码示例如下:#include<stdio.h>voids......
  • C++基础 -13- 类的字节对齐
    ———————标准输入输出——————— ......
  • 【数据结构】C语言实现双链表的基本操作
    双链表导言大家好,很高兴又和大家见面啦!!!经过前面几个篇章的内容分享,相信大家对顺序表和单链表的基本操作都已经熟练掌握了。今天咱们将继续分享线性表的链式存储的第二种形式——双链表。在今天的内容中,咱们将介绍双链表的创建以及一些基本操作,接下来跟我一起来看看吧!一、单链表与双......
  • 【题解】BZOJ 4403序列统计
    tg.BZOJ4403序列统计pj.BZOJ4403序列统计没啥用的题解\(QWQ\)——无脑思考首先要想怎么求单调不上升序列的个数,因为可能会有重复的数,所以不能直接用排列组合。那这道题怎么打呀?我不知道啊\(\dots\)\((~:\)因为原来是单调不下降序列,将第\(i\)位上的数加\(i\),于是......
  • 整数除法:floor、ceil、round——《初学C语言第42天》
    //////整数除法——舍小数,取整数//1.floor()头文件<math.h>//功能:把一个小数向下取整,即如果被计算的数是2.2,那向下取整的结果就为2.000000//原型:doublefloor(doubex);//x:是需要计算的数//返回值://   成功:返回一个double类型的数,此数默认有6位小数//   ......
  • 力扣448-找到所有数组中消失的数字
    难度:【简单】常规笨方法做一遍:先遍历一遍记录到哈希表中,再从1到n遍历一遍,不在哈希表中的记入返回数组中,时空复杂度都是O(n)。尝试优化空间复杂度到O(1):先填满返回数组,再遍历原数组,原数组中出现的元素删掉。也是朴素的笨方法,所以超出了时间限制。这让我体会到了数组查找元素的时......
  • 网站 80,443 端口一直被恶意攻击怎么办?
    DDOS攻击简介分布式拒绝服务攻击(DDoS攻击)是一种针对目标系统的恶意网络攻击行为,DDoS攻击经常会导致被攻击者的业务无法正常访问,也就是所谓的拒绝服务。常见的DDoS攻击包括以下几类:网络层攻击:比较典型的攻击类型是UDP反射攻击,例如:NTPFlood攻击,这类攻击主要利用大流量拥塞被......
  • macOS Sonoma 14 (23A344) 正式版 Boot ISO 原版可引导镜像下载
    macOSSonoma14(23A344)正式版BootISO原版可引导镜像下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。作者主页:sysin.orgmacOSSonoma推出全新功......
  • macOS Sonoma 14 (23A344) 正式版发布,ISO、IPSW、PKG 下载
    macOSSonoma今日推出,全面提升生产力和创意工作流macOSSonoma14(23A344)正式版发布,ISO、IPSW、PKG下载本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质......