结构体 共用体

本文详细探讨了结构体中成员的内存分配策略,重点关注了int和float类型的大小对整体结构大小的影响,以及共用体内存管理的特性,通过实例说明了IP转整数的内存操作。同时揭示了节点内存偏移和共用体内存共享的原理。

结构体

在这里插入图片描述
在这里插入图片描述
结构体首先要找到类型中最大的字节数 int 和float 最大是 4 所以 char gender 要开辟四个字节但只能用一个 所以这个总的大小是32字节
在这里插入图片描述

node1 最大的是Int 是四个字节 ,当第一次开辟四个字节的时候 char a 占了一个 轮到char b的时候前面开辟的四个字节还剩下三个 所以char b不用开辟可以直接用
在这里插入图片描述

  • 第一个成员在与结构体变量偏移量为0的地址处。
  • 偏移量就是 你这个变量的位置 比如你是char a,上面是int b,这样你偏移量就是4

共用体

共用体内存取类型最大的
实现ip 转整数

在这里插入图片描述

### C语言中结构体共用体的赋值方法 #### 结构体赋值 在C语言中,可以使用多种方式给结构体成员赋值。一种常见的方式是在声明时直接初始化: ```c struct Student { int age; char name[20]; }; // 初始化整个结构体变量 struct Student stu1 = {5, "sb"}; ``` 也可以逐个字段进行赋值[^3]。 对于已经存在的结构体实例,可以通过点运算符`.`或者箭头运算符`->`(当通过指针访问时)来修改其成员: ```c stu1.age = 6; struct Student *p = &stu1; p->age = 7; (*p).age = 8; // 这种写法与上一句效果相同 ``` 还可以利用复合字面量来进行临时对象创建并复制到目标位置: ```c stu1 = (struct Student){9, "newName"}; ``` #### 共用体赋值 共用体(union)是一种特殊的数据类型,在同一内存区域存储不同类型的数据项。每次只能保存其中一个数据类型的值。因此,对共用体成员赋值会覆盖之前存入的数据。下面展示了一个简单的例子说明如何操作共用体成员: ```c union Data { int i; float f; char str[20]; } data; data.i = 10; // 给整型成员赋值 printf("Integer Value: %d\n", data.i); data.f = 220.5; // 浮点数成员被赋予新值的同时,之前的整数值会被覆盖 printf("Float Value: %.1f\n", data.f); ``` 需要注意的是,由于所有成员共享相同的内存空间,所以一旦改变某个成员的值,则其他成员的内容也会受到影响。这使得共用体非常适合用于处理不同格式间转换的情况或是节省内存资源的应用场景下[^1]。 #### 完整示例代码 这里给出一段完整的演示程序,展示了上述提到的各种赋值技巧以及结构体内存布局特点: ```c #include <stdio.h> #include <string.h> struct Employee { char id[10]; union Info { int salary; struct Address { char city[20]; char state[20]; }; } info; }; int main(void){ struct Employee emp = {"E001", .info.salary=5000}; // 使用指定初始器 strcpy(emp.id,"E002"); // 修改id字符串 emp.info.salary = 6000; // 更新salary成员 // 切换至address模式前需先清空原有数据以防未定义行为 memset(&emp.info, 0, sizeof(emp.info)); strncpy(emp.info.city, "Beijing", sizeof(emp.info.city)-1); strncpy(emp.info.state, "China", sizeof(emp.info.state)-1); printf("Employee ID:%s Salary:%d City:%s State:%s\n", emp.id, emp.info.salary, emp.info.city, emp.info.state); return 0; } ``` 此段代码不仅体现了基本的赋值逻辑,还涉及到了更复杂的嵌套结构体加联合体组合形式下的具体实现细节[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值