核心内容摘要
开源项目贡献:软件测试从业者履历跃升与副业变现的双赢路径
本文介绍了C语言中结构体的基本概念和
使用方法。
主要内容包括
结构体声明语法和成员访问方式
结构体内存对齐规则及其对空间利用的影响
通过示例展示了不同成员排列顺序对结构体大小的影响
结构体位段的
使用方法及其与普通结构体的区别
位段的内存分配特点和使用
注意事项包括其不跨平台的特性和内存地址限制。
文章强调结构体传址调用的优势并指出合理排列成员变量可以优化内存空间利用。
结构体的声明结构体属于自定义类型 C语言中有结构体 枚举 联合体struct{成员变量;}结构体变量;.访问成员变量间接访问-指针-成员变量匿名对象只可以使用一次想使用匿名对象 需要重名 使用里面的成员变量 直接引用结构自引用定义结构体不要使⽤匿名结构体了在匿名对象中 提前使用名字来访问是不对的结构体内存对⻬对齐规则1一个成员变量到起始地址的偏离量为02其他成员变量要对齐对齐数的整数倍的地址处3整个结构体的最大对齐数等于 成员变量的最大对齐数4重叠结构体对⻬数 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
vs默认为8练习/练习1structS1{charc1;inti;charc2;};printf(%d\n,sizeof(structS
);//练习
......structS2{charc1;charc2;inti;};printf(%d\n,sizeof(structS
);//练习3structS3{doubled;charc;inti;};printf(%d\n,sizeof(structS
);总大小为16个字节//练习4-结构体嵌套问题structS4{charc1;structS3 s3;doubled;};printf(%d\n,sizeof(structS
);同一类型的数值最好放在一起 节约空间 像S1和S2一样 不同顺序 结果不同结构体的内存对⻬是拿空间来换取时间的做法#pragma pack()#pragma pack()修改对齐数而单独的pramga pack恢复默认的对齐数结构体传址调用传址调用比传值调用大大节约了空间结构体传参的时候要传结构体的地址。
结构体实现位段位段是成员变量 数字 形式内存分配
位段的成员可以是int unsigned int signed int或者是char等类型
位段的空间上是按照需要以4个字节int或者1个字节char的⽅式来开辟的。
位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使⽤位段。
注vs在同一空间是从右向左存比特位 如果开辟一个不足则不要了 重新开辟一个与结构相比 更省空间 但 有风险位段使⽤的
注意事项位段的⼏个成员共有同⼀个字节这样有些成员的起始位置并不是某个字节的起始位置那么这些位置处是没有地址的。
内存中每个字节分配⼀个地址⼀个字节内部的bit位是没有地址的。
所以不能对位段的成员使⽤操作符这样就不能使⽤scanf直接给位段的成员输⼊值只能是先输⼊放在⼀个变量中然后赋值给位段的成员。