解析C语言结构体

来源:互联网 发布:vscode开发python 编辑:程序博客网 时间:2024/05/16 12:55

在实际的应用当中,我们可能遇到很多数据类型以及长度都是一样的,如果一条一条声明的话,会很麻烦,那有什么解决方法,可以解决这个问题呢?于是在C中引入了结构体。

一、定义结构体类型

在声明结构时,必须列出它包含的所有成员。这个列表包括每个成员的类型和名字。

比如下面这个声明,创建了一个叫x的变量,它包含了三个成员,一个整数、一个字符和一个浮点数。

Struct Simple{int a;char b;float c;} x;

二、结构的初始化

结构体的初始化和数组的初始化很类似,结构中如果包含数组或结构成员其初始化方式类似于多维数组的初始化。

一个完整的聚合类型成员的初始值列表可以嵌套与结构的初始值列表内部。如下:

Struct INT_EX{int a;short b[6];Simple c;} x = { 10,{ 1, 2, 3, 4, 5 },{33, 'x', 1.6}};
三、结构体的typedef 
用typedef可以声明一个新的类型名来代替已有的类型名。如下:

typedef struct{int month;int day;int year;}date;
以上结构体的所声明的新类型名date代表上面指定的一个结构体类型。
四、结构体的内存存储

编译器按照成员列表的顺序一个接一个给每个成员分配内存,只有当储存成员是需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外空间。如下:

struct student{char name;int num;char subject;};
当机器的整型长度为4个字节时,并且它的起始储存位置必须能被4整除,结构体的第一个成员永远都放在结构的0偏移处,从第二个开始都要对齐到某个对齐数的整数倍处那么此结构体的内存中储存如下所示


为什么会出现内存对齐呢,主要有以下俩个原因:

(1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

(2)性能原因:数据结构应该尽可能地在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器需要做两次内存访问;而对齐的内存访问仅需要一次访问。

五、关于位段

位段的声明和结构类似,但它的成员是一个或多个位的字段。这些长度不同的字段实际上储存于一个或多个整型变量中。除了与普通的结构成员声明相同外,位段成员必须声明为int、singed int或unsinged int类型(当段位声明为int时,该位段为有符号数还是无符号数由编译器所决定),并且在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目。例子如下:

struct S  {     unsighted int  a : 16;     unsighted int  b : 13;    };

位段在内存中的存储,当一个声明指定了n个位段,第二个位段无法放在第一个位段剩余的位上,编译器会把第二个位段放在内存的下一个字节上,如果足够放下也可能直接放在第一个位段后面。跟很多代码相似的,位段也需要考虑平台不一样的问题,因为在32位平台和16位平台存储方式是不一样的,拿int类型的来举例子,若在32位平台int类型就可以有32位的大小,若转至16位平台就很可能出现错误,所以在设置位段时应注意跨平台的问题。

欢迎各位观看,如有错误请留言指教。

原创粉丝点击