struct中的字节对齐问题

原因:CPU为了快速的存取内存从而存在内存问题


分析方法:

  • 有例子1
#include <stdio.h>
struct A{
    char a2; // 占一字节
    char a3;
    char a;
    short i; // 占两字节
};
int main(int argc, const char *argv[])
{
    struct A aa = {0x1, 0x2, 0x3, 0x5555};
    char *p = &aa;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(aa));
    for (i = 0; i < sizeof(aa); i++)
    {
        printf("%#x ", *p);
        p++;
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 6
0x1 0x2 0x3 0 0x55 0x55

  • 例子2
#include <stdio.h>
struct A{
    short b;
    char a;
    int c;
};
int main(int argc, const char *argv[])
{
    char array[100] = {0x0,0x0,0,0,0,0,0,0,0};
    struct A *aa = (struct A *)array;
    aa->b = 0x1122;
    aa->a = 0x33;
    aa->c = 0x01223344;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(struct A));
    for (i = 0; i < sizeof(struct A); i++)
    {
        printf("%#2x ", array[i]);
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 8
0x22 0x11 0x33 0 0x44 0x33 0x22 0x1

如果结构体是这种:

struct A{
    char a;    //这两个位置互换
    short b;    //至两个位置互换
    int c;
};

sizeof(struct A) = 8
0x33 0 0x22 0x11 0x44 0x33 0x22 0x1


结论/方法:

  • 当一个结构体中有不同的数据时,在 linux 中遵循 1,2,4的对齐方式,注意没有 8
  • 结构体中的占字节数最多的元素决定二维容器的宽度
  • 最近的两个数据要对齐到其中最大的边界上,小的那个要用0来对齐。比如 1,2 则对齐的方式是1 0 2 。

图形表示:

在程序一和程序二中内存的情况是:

这里写图片描述 这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值