C语言:2026.1.30(位段,联合体)

一.位段

  1. struct A
    {
    int a1:4;
    int a2:4;
    };
    2.位段是由结构体所实现的,位段的声明和结构体类似,位段成员可以是int,unsigned int, signed int char,位段成员表示为类型名 成员名:整数.这个整数表示当前成员所占比特位的个数;
    3.位段的空间上,是根据成员以四字节或一字节大小开辟空间的,位段涉及很多不确定因素,位段是不跨平台的
    4.跨平台问题:
    1.int位段是当作有符号int还是无符号int是不确定的
    2.位段中成员的最大数目不能确定,因为不同机器的字长不同,16位机器一个字节是16个bit位,而32位机器字长是32位;
    3.分配的字节是从左往右使用还是从右往左使用不确定
    4一个成员剩余的比特位是否浪费,还是由第二个成员继续使用,这是不确定的
    5.所以位段比结构可以更节省空间,但是有跨平台问题
    二.联合体
    1.联合体是一种数据类型和结构体,一样是由多个成员构成,这些成员可以是不同的类型
    union S
    {
    char a;
    int n;
    };
    2.共用同一块内存,不能同时使用;联合体是在同一内存空间中存储不同的数据类型,不是同时存储,意味着给联合体其中一个成员赋值,其他成员的值也会随之变化
    3.大小端:
    三.枚举
    1.枚举就是把可能的值一一列举出来,可以用枚举类型声明符号来表示整型常量,对于枚举类型,声明的时候可以给成员一个初始值,没有默认0;依次递增;
    2.声明:
    enum Color
    {
    red,
    blue,
    green
    };
    3.优点:
    一 增加代码的可读性和可维护性。
    二 #define定义的标识符比较,枚举有类型检查更加严谨。
    三 便于调试预处理阶段会删除#difine定义的符号。
    四 使用方便。一次可以定义多个常量,
    五 枚举常量是遵循作用域规则,枚举声明在函数内只能在函数内使用

四.动态内存
1.#include<stdlib.h>
2.malloc
void malloc(size_t size);功能:向内存申请一段连续的内存空间大小为size,单位为字节,返回这段空间的首地址,开辟成功就返回一个指向开辟好空间的指针,开辟失败就会返回一个null指针,返回值类型是void,因为malloc不知道申请的这个空间是用来存放什么类型的数据,所以返回void使用时需要自己进行强制类型转换
3.释放
void free(void
ptr);释放ptr这个指针所指向的内存空间,注意ptr可以是任何类型的指针,但必须是调用函数动态开辟出来的。Free(NULL)对于一个空指针进行释放,不会报错
4.calloc,对内存初始化为0;
void * calloc(size_t num,size_t size),
5.realloc,扩容函数;
void *realloc(void * ptr,size_t size);扩容之后的整体大小,单位是字节;
6.内存泄露:如果对于一段动态申请的空间使用完之后没有正确free会导致这个空间一直被占用,其他进程用不了这段空间;内存泄露太多的话,系统就没内存了;
7.异地扩容:先拷贝,再释放;
8.原地扩容
9.对于同一块内存,只free一次;

posted @ 2026-02-01 21:57  白白0419  阅读(0)  评论(0)    收藏  举报