搜索
写经验 领红包

c语言结构体内存大小(c语言结构体存储空间)

导语:C语言系列_6:结构体,内存对齐,成员变量硬核总结

第七章:结构体(1)结构体的声明,定义,初始化和成员访问A:什么是结构体

世界的物体的性质是复杂多样的,就拿人而言,人绝对不能用一个整形数据(比如说身高),或者说字符串(比如说姓名)而单独囊括的,于是我们在描述一个复杂对象的时候,就要使用的结构体,结构体是一些值得集合,这些值称为成员变量,每个成员变量可以是不同的类型

B:结构体声明和定义

比如这里我们要描述一个学生,一个学生的信息主要包括姓名,年龄和学号组成

上述我们在main函数中通过,定义的struct Student 创建了一个结构体变量S,这样的创建方式属于局部变量

我们还可以直接在参数列表处直接定义,这样定义的就是全局变量

还有我们经常在数据结构中见到的一种写法,它其实相等于就是重新命了一个名字

C:结构体的初始化

第一点:普通初始化

第二点:嵌套初始化

结构体的成员可以是标量,数组,指针,甚至是其他结构体

D:成员访问

上述循环嵌套的访问方式如下

(2)结构体传参

结构体不能直接使用printf函数打印,需要打印时可以自己封装print函数,而这就涉及到了传参和传递地址的问题,于是结合前面第五章讲到的结构体指针的相关知识,具有以下两种打印方式

上述两种方式的展示揭示了一点,由于结构体的数据比较多,所以我们以后在操作时要传结构体的地址,如果传结构体的值那么对于内存的开销就比较大,如果传入地址,那么我只需使用一个很小的指针就能操作内存。

(3)结构体自引用

在数据结构,链表那一章有如下让我困惑很久的写法,现如今明白了他是一种自引用。一个结构体有两个部分,一个部分是数据域,一个部分是指针域,在创造结点也就是建立结构体成员时,每个成员除了有一个数据域用来存放数据外还有一个指针域,在指针域里面存放的是一个地址,这个地址指向下一个结点也就是下一个结构体成员的内存地址

(4)内存对齐

暂时了解即可

(5)结构体传参

和前面说过的交换两个变量的经典例子一样,对结构体内的变量进行修改时需要传入地址,用结构体指针来接受,如果只是去使用结构体变量的值的话,就只传入值即可

(6)位段

第一:位段是什么

“节省空间”这四个字可以直截了当地点名位段的作用。

在结构体设计中,如果一个整形数据我们用来存年龄,但是年龄这个东西再大也不会用一个上亿的数据范围来存储它,也就是它的范围一般是1-100,反应在整形数据的内存上,使用的可能就是32个比特位中的个别几个,也就说剩余的很多比特位就是根本不会用到的,而如果明知道这样,还要不管三七二十一直接抛出一个整形,四个字节,32个比特位存储这么小的数,未免显的有点浪费了。

所以正式鉴于此,位段就能合理地进行内存设计

第二:位段及设计要求

位段的基本格式如下,和结构体十分相似,其内部的数据类型一般要求是一致的

上述这个结构体所占空间大小为八个字节,在实际分配时,会一上来先分配四个字节,其中a,b,c占据2+5+10共17个比特位,剩余d需要30个比特位存储但是不够,所以再分配四个字节,拿出其中30个比特位存储。可以看出相比之前暴力的直接16个字节,现在的8个字节大大地节省了空间。

第三:位段的缺陷

位段确实能节省空间,但是它有一个致命的缺陷问题就是跨平台问题,C语言标准并没有准确规定位段的以下标准问题

这也就导致不同编译器在实现位段时有着不同的访问,所以在编写跨平台程序时应避免使用位段

第四:位段的应用

位段能极大的节省空间,在计算机网络传输中,对于一个数据的打包会有不同的封装,而这些封装信息如果直接抛出几个整形,那么势必在传输会造成网络拥堵,所以使用位段就能极大的压缩空间

本文内容由快快网络小荣整理编辑!