位段,枚举,联合以及动态内存

本文详细介绍了C#中的位段、枚举和联合的使用,包括位段的跨平台问题,枚举的定义及其优点,联合的特性和动态内存管理。动态内存部分讲解了malloc、free、calloc和realloc的用法,特别是realloc在内存扩展时的情况分析。
摘要由CSDN通过智能技术生成

1.1位段

位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。


_a表示占用2个比特位,_b占用5个比特位, _c占用10个比特位, _d占用30个比特位;

先开辟一个整型,4个字节,32个比特位,_c用去2个剩余30个,_b用去5个剩余25,_c用10剩15,但是_d需要30个比特位,剩余的15个不够,因此再增加一个整型,所以最后打印出来的8个字节;

例2:

 ​

 1.2 位段的跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的。

2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的

 总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

 2.1 枚举类型的定义


以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
例如:

初始值

 

赋值:


2.2 枚举的优点

 
为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量

3.1联合类型的定义(公用体)

 联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
比如:

3.2联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)

判断大小端

 

 3.3 联合体大小的计算

动态内存

1.为什么要掌握动态内存

2.动弹内存的介绍

2.1 malloc和free

size_t size是要开辟空间的大小,单位字节; 

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,返回的是开辟空间的起始地址,malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己
来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器
 

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
    void free (void* ptr);

 free后p变成了野指针,所有需要将它变成NULL;

2.2 colloc

colloc开辟空间成功返回空间起始地址,失败则返回NULL,与molloc一样;

与molloc相比,colloc函数会初始化空间,molloc不需要初始化,molloc的效率更高;

直接打印开辟出来的空间

 

 2.3 realloc

realloc可以开辟空间,也可以调整空间

realloc开辟空间有两种情况:

    情况1:原空间之后有足够空间

    情况2:原空间之后没有足够空间

情况1:
   当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2:
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小
的连续空间来使用。这样函数返回的是一个新的内存地址
 

情况2的realloc使用示例

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值