首页 > 其他分享 >C语言结构体知识

C语言结构体知识

时间:2024-05-28 22:58:57浏览次数:28  
标签:字节 占用 知识 C语言 类型 对齐 变量 结构

一:什么是结构体

        结构体 英文名:Structures 。是一种用户定义的数据类型,它允许你将不同类型的数据组合在一起,变成一个单独的单元,这个单元里面包含了用户所创建的不同类型的变量

二:关于结构体类型

       如上图 在这个示例中,Stu就是一个结构体类型,它包含了三个成员:name(字符数组类型)、age(整数类型)、float(浮点数类型)。

三:结构体变量的创建和初始化             

                        

    声明完结构体时就可以创建结构体变量就可以进行结构体变量的创建以及初始化。

如上图示例 创建了一个Stu 类型的S变量,通过“.”操作符将结构体里的变量进行赋值.

也可以用指针通过“->”操作符将变量进行赋值。

四:关于结构体内存大小

        是的结构体也存在内存大小,那么结构体的内存大小是如何计算的呢?

                

        通过上图例子可以看到,运用sizeof操作符计算出Stu类型的结构体占用了八个字节的内存。

那么为什么呢?想知道就必须先要了解结构体内存对齐。

结构体内存对齐:

    1.什么是结构体内存对齐:   是指编译器在为结构体分配内存时,按照一定的规则将结构体成员按照特定的对齐方式排列在内存中的过程。内存对齐的目的是为了提高内存访问的效率和性能

     2.结构体内存对齐规则:

        (1)  结构体第一个成员在与结构体变量偏移量为0的地址处

      (2)  其他成员则要对齐到某个数字 这个数字为对齐数的整数倍的地址处 

                对齐数=编译器默认的对齐数与该成员大小相比较 得到的较小值就是对齐数 如vs默认对齐数为8

        (3)  结构体的总大小为最大对齐数的整数倍

        

        通过图可以看出,结构体成员a的类型是int,恰巧它是第一个成员 所以它的位置在偏移量为0的位置,a的起始位置为0 又因为a为int类型 int占4个字节与默认对齐数8进行比较 得到的较小结构为4 所以a占用的内存为0-3的空间(共四个字节)。变量c的类型为char 占1个字节 与默认对齐数8比较 得到结果为1 那么它的位置在1的倍数的位置(从a后的位置往下找) 得到结果为5 ,b也是如此。所以a,b,c总共占用了6个字节的大小。但还没完,结构体内存的总大小为最大对齐数的整数倍。这个最大对齐数是结构体成员的最大值 为4。 现在得到了最大对齐数那么只需要计算出最大对齐数的整数倍就可以得到最终的大小。 从刚才得到a,b,c总占用大小为6 显然不是4的倍数 所以要再浪费两个字节大小得到8个字节。最终得到结构体的总大小为8。

看到这里就会不禁在想如果将结构体成员位置顺序调换 是否对内存大小有影响?答案是会的。

这里将 a与c的位置进行调换可以看出 char类型c为偏移量为0的位置占用1个字节 a为int将占用四个字节的位置 而a的对齐数为4 需要从4的倍数开始对齐 所以浪费1-3空间 从4开始占用。b为1占用一个字节,占用了8的位置

从0-8一共占用9个字节的空间 最大对齐数为4 9个字节需要4的3倍才能装下 一共需要12个字节

最终得到结构体的总大小为12。

五:结构体传参

结构体可以进行传参,有传参数以及传指针的方法,通常传递指针的方式,传递指针效率更改,如果害怕指针修改了参数的值可以写形参时在前面加const,以保证参数安全。

标签:字节,占用,知识,C语言,类型,对齐,变量,结构
From: https://blog.csdn.net/2301_80894970/article/details/139179980

相关文章

  • C语言猜数字游戏完整版
    题目:电脑随机生成1~100的随机数;玩家猜数字过程中,根据猜测数据的大小给出或多或少的反馈,直到猜对,游戏结束。首先,随机数的生成:①rand函数可以生成随机数,rand函数会返回一个伪随机数,这个随机数的范围是0~RANDMAX之间;②srand函数:用来初始化随机数的生成器;③time函数:在程序......
  • 知识产权与标准化
    知识产权与标准化导航目录知识产权与标准化导航一、知识产权概述二、保护范围与对象三、保护期限四、知识产权归属五、侵权判定六、标准的分类一、知识产权概述知识产权:知识产权是指人们就其智力劳动成果所依法享有的专有权利,通常是国家赋予创造者对其智力成果在一定时期内享......
  • 项目管理基础知识
    项目管理基础知识导航目录项目管理基础知识导航一、项目相关概念二、时间管理三、人员管理四、风险管理一、项目相关概念项目定义的三层意思一定的资源约束:时间资源、经费资源、人力资源一定的目标一次性任务里程碑是项目中的重要时点或事件持续时间为零,其代表的是......
  • 数据结构与算法
    数据结构与算法导航目录数据结构与算法导航一、数据结构与算法概念数据结构的定义算法伪代码二、线性表线性表三、队列与栈栈队循环队列四、窜广义表窜五、数组六、树与二叉树树二叉树七、图图的存储八、查找五大查找顺序查找二分查找二叉查找树(排序)二叉平衡树哈夫曼树B-树B+......
  • 网络基础知识
    网络基础知识导航目录网络基础知识导航一、OSI/RM七层模型二、TCP/IP协议族电子邮件协议WWW协议FTP协议其他协议端口常见设备的部署位置与网络介质三、IP地址与网络划分地址掩码计算IP所属网段变长子网掩码变长子网计算特殊含义的IP地址四、DNS和DHCP五、网络规划设计六、网络故......
  • 安全性基础知识
    安全性基础知识导航目录安全性基础知识导航一、网络攻击二、两类密码体制-对称密钥密码体制网络安全内容三、数字签名与信息摘要四、数字信封五、PKI六、防火墙技术七、入侵检测系统八、计算机病毒九、常见的防病毒软件十、网络安全协议一、网络攻击二、两类密码体制-对称密......
  • 数据结构-单向链表的实现(c语言)
    链表的定义:链表是由一系列的结点组成的,每个结点包含两个域,分别是指针域(*next)与数据域(data)。单向链表的实现//.h文件#ifndeDXLB_H#defineDXLB_H//定义结点结构体typedefstructLINKNODE{structLINKNODE*next;//指向下一个结点的指针intdata;......
  • 数据结构—线性表
    线性表的定义:    线性表是具有相同特性的数据元素的一个有限序列,类似于数组。    线性表中的元素都有一个直接前驱和直接后继,除了第一个首元素和最后一个元素线性表的实现:    使用线性表模拟动态数组的实现:                //.......
  • C语言中strncpy、strncat、memcpy、memmove函数的详解与比较
    目录目录C语言中strncpy、strncat、memcpy、memmove函数的详解与比较一、strncpy函数二、strncat函数三、memcpy函数四、memmove函数C语言中strncpy、strncat、memcpy、memmove函数的详解与比较一、strncpy函数strncpy是C语言标准库中的一个函数,用于将字符串src复制到字符串d......
  • 数据结构初阶 栈
    一.栈的基本介绍1.基本概念栈是一种线性表是一种特殊的数据结构栈顶:进行数据插入和删除操作的一端另一端叫做栈底压栈:插入数据叫做压栈压栈的数据在栈顶出栈:栈的删除操作叫做出栈出栈操作也是在栈顶栈遵循一个原则叫做后进先出(比如说子弹的弹夹其实就是一种设......