struct和union的内存分配

struct

struct结构体在分配内存时需要遵循内存对齐规则:
1. 结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除;
2. 前面单元的大小必须是后面单元大小的整数倍(每个数据成员存储的起始地址必须是自身大小的整数倍),如果不够就补齐;
3. 整个结构体的大小(即sizeof的结果)必须是最大数据类型的整数倍;

struct T{
    char c;
    int i;
    long long l;
    char ch;
};
T t = {'a',0,0,'b'};
T* p = &t;//0x28fee0
char* p_c = &t.c;//0x28fee0
int* p_i = &t.i;//0x28fee4
long long* p_l = &t.l;//0x28fee8
char* p_ch = &t.ch;//0x28fef0
printf("sizeof T:%d\n",sizeof(T));//24
union

union关键字的用法与struct类似,但其空间大小仅为最大长度的数据成员,即union中的所有成员变量共享相同的内存区域

大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中

通常linux中采用小端模式,即高字节存储在高地址中

union{
    int32_t i;
    struct{
        int16_t l;
        int16_t h;
    }s;
}u;
u.i = 0x12345678;
printf("%x %x\n",u.p.l,u.p.h);//5678 1234
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值