24/06/26(12.1125)自定义类型,动态内存管理

1.字节对齐,猜它占几个字节

struct test{
    short a;       //2+6
    struct{            
        int b;        //4+4
        double c;   //8        //24
        char d;        //1+7
    };
    int e;            //4+4
};

所以占40个字节

struct test{
    short a;       //2 + 6
    struct{            
        int b;        //4 + 4
        double c[10];   //80  //96
        char d;        //1 + 7
    };
    int e;            //4 + 4
};

//112

struct test{
    short a;       //2 + 6
    struct t{            //在struct之后写了字母t,它从成员变成了类型
      double c    //8

          int b;        //4 
        char d;        //1 + 3
    };
    int e;            //4 + 4
};

//在C里依然是32,C++里类型不占大小

在没有特殊要求的情况下,让占用空间小的成员在一起,就是从小到大写.

修改默认对齐数#pragma pack()

#include<stdio.h>
#include<stdlib.h>

//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)
//程序指定对齐值
//程序有效对齐值

typedef struct test{
    char a : 1;// 位域
    char b : 1;
    char c : 1;
}test;

int main(){
    printf("%d\n",sizeof(test));

    system("pause");
    return 0;
}

使用位域使本来要开辟三个字节变成只开辟一个字节,(因为一个字节8个位,这才用了三个)

1.位域不能跨字节存储

2.位域不能跨类型存储

typedef struct test{
    char a : 1;
    int b : 1;
}test;

int main(){
    printf("%d\n",sizeof(test));

    system("pause");
    return 0;
}

所以这里是8不是1!它依然要考虑字节对齐.

位段就是位域

结构体传参的时候尽量传结构体的地址.

枚举

自定义类型 : struct enum union

#define SIZE 10
enum{CAPACITY = 100};

int main(){
    int n = SIZE;//宏 常量
    int m = CAPACITY;//枚举 常量
    const int sz = 20;//

    system("pause");
    return 0;
}

//

枚举示例:

enum TYPE{
    ADD,
    SUM,
    MUL,
    DIV
};

结构体示例:

struct TYPE{
    char a;
    char b;
    char c;
    char d
};

两个都需要在末尾加分号,但一个用逗号分隔一个用分号分隔.

enum TYPE{
    ADD,
    SUM,
    MUL,
    DIV
};
int main(){
    printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);

    system("pause");
    return 0;
}

如果不给里面元素赋值,那么默认后一个的元素是前一个元素+1

试着附一个值(这个值可以是整数的任何数但不能是浮点型):

enum TYPE{
    ADD,
    SUM = 10,
    MUL,
    DIV
};
int main(){
    printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);

    system("pause");
    return 0;
}

enum TYPE{
    ADD,
    SUM,
    MUL,
    DIV
};
int main(){
    printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);
    printf("%d\n",sizeof(enum TYPE));
    system("pause");
    return 0;
}

不管枚举里元素有多少个,枚举的大小永远只有一个

联合体(共用体)

union的声明

union test{
    char a;
    double b;
    char c;
};

int main(){
    
    printf("%d\n",sizeof(union test));
    system("pause");
    return 0;
}

按最大的元素分配空间

union Un {
    int i;
    char c;
};

int main(){
    union Un un;
    //下面输出结果一样吗
    printf("%d\n", &(un.i));
    printf("%d\n", &(un.c));

    //下面输出的结果是什么
    un.i = 0x11223344; //44 33 22 11
    un.c = 0x55;            //55 33 22 11
    printf("%x\n",un.i);
    system("pause");
    return 0;
}

联合体仍然存在字节对齐

union Un1 {
    int i;        //4
    char c[5];    //5
};
union Un2 {
    int i;        //4
    short c[7];    //7x2 = 14
};
int main(){
    //下面输出的结果是什么
    printf("%d\n", sizeof(union Un1));
    printf("%d\n", sizeof(union Un2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值