c语言内存对齐

记录平常所学,以便回顾。

c语言中存在着内存对齐问题,在struct存储中尤为明显,这里先介绍一种情况,以后接着补充。

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef unsigned long long int u64;
struct s1
{
    u8 a;
    u16 b;
    u8 c;
}

struct s2
{
    u8 a;
    u32 b;
    u8 c;
}

struct s3
{
    u8 a;
    u64 b;
    u8 c;
}
void main()
{
printf("%d\n", sizeof(struct s1));
printf("%d\n", sizeof(struct s2));
printf("%d\n", sizeof(struct s3));
}

结果为:s1占6个字节,s2占12个字节,s3占24个字节。

内存对齐的字节数,以结构体中所占内存数最大的为准,即s1以2个字节对齐,s2以4个字节对齐,s3以8个字节对齐。

s1在内存中的存储为:


a放在0地址,因为是2字节对齐,而b占两个字节,所以放在2、3地址,c虽然占一个字节,但是5地址也是s1的空间。


s2在内存中的存储为:


a放在0地址,b占4个字节,同时s2是4字节对齐的,所以在0-3地址放不下b,将b放在下一个4个字节处,c放在8位置,虽然后面没有数据,但是仍然要占4个字节。

s3也是如此,a在0地址,b在8-15地址存储,c存在16地址,共占24个字节。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值