C语⾔结构体及内存补齐和对齐
结构:
结构是由多种内建数据类型组合成的⼀个整体,⽤于描述⼀个事物的各项数据
设计结构体:
⼀般结构体设计在头⽂件或函数外,⽅便其它⽂件、其它函数使⽤
struct TypeName
{
类型 成员名;
…
};
注意:此时只是完成了数据类型的设计c语言struct头文件
相同类型的结构变量可以直接赋值,因为它们的数据顺序是⼀样的。
定义结构变量:
struct TypeName 结构变量名;
初始化成员:
struct TypeName 结构变量名 = {数据1,数据2,…};
注意:要按照成员的顺序进⾏初始化。
struct TypeName 结构变量名 =
{
.成员名 = 数据1,
.成员名 = 数据2
,…
};
注意:可以⽆视成员的顺序,但要指定成员名
访问成员
结构变量.成员名;
结构指针 -> 成员名;
使⽤堆内存存储结构变量
struct TypeName* p = malloc(sizeof(struct TypeName));
由于编译时,堆内存还没有分配,所以编译器⽆法初始化,只能批量赋值或单个赋值
给结构类型重定义
由于在C语⾔中 struct关键字⽆法省略,导致使⽤时⿇烦,可以使⽤ typedef关键字给结构重定义
Typedef struct TypeName
{
…
}TypeName;
结构的字节数计算:
系统为了快速的访问结构的成员,会对结构的成员在内存排列时进⾏内存补齐和对齐,因此结构体的成员顺序会影响结构体的总字节数,⼀般结构的总字节数会 >= 所有成员的字节数之和。
对齐:
假定第⼀个成员使⽤0地址,所有成员所使⽤的地址必须能被它的字节数整除,如果不能则补充⼀些空字节。
补齐:
结构体的总字节数必须是它最⼤成员的整数倍,如果不是则补充⼀些空字节。
注意:在linux系统中,在计算对齐和补齐时,成员的字节数超过4,则按4字节计算。
联合:
也是⼀种由程序设计的⼀种数据类型,,使⽤语法与结构⼀样,只是成员的排列⽅式不同,所有成员共⽤⼀块内存,⼀个成员的值发⽣变化,其它成员的值也会发⽣变化。
它可以⽤⼀块内存对应多个标识符,达到节约内存的⽬的,现在已经基本不⽤。
union Data
{
类型 成员名;
…
};
系统的⼤⼩端:
⼩端系统:低位数据存储在低位地址
⼤端系统:低位数据存储在⾼位地址
⼀般个⼈计算机使⽤的是⼩端系统,⼤端服务器、⽹络设备使⽤的是⼤端,⼤端字节序也叫⽹络字节序。
枚举:
枚举是⼀种特殊的整型数据,它是把⼀个整型数据可能出现的值全部罗列出来并取⼀个有意义的名字(枚举值)。
设计好的枚举类型,也可以定义枚举变量。⽽枚举变量只能赋值为枚举值,以此来保证数据的安全,提⾼程序的可读性。
但编译器为了速度,并不会检查枚举变量的赋值。
enum Direction
{
Up,
Down,
Left,
Right
};
枚举值是常量,可以使⽤在case语句后⾯,不⽤再写字⾯值常量,从⽽提⾼程序的可读性。可以定义匿名枚举,只使⽤枚举值。
枚举值在不指定值的情况下,第⼀个默认为0,之后逐渐+1。也可以单个指定。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论