c语言结构体内存对齐问题

    c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的大小会发生改变,下面给出一个示例:

#include <stdio.h>
struct person{
  char sex;
  int age;
  char name[8];
};
int main()
{
  printf("sizeof(person) = %d\n",sizeof(struct person));
  return 0;
}

    这个示例很简单,就是定义一个结构体,三个属性:分别是char类型的sex,int类型的age,char[]类型的name,直观的看,大小应该是1+4+8=13,但是我们编译,运行,结果如下所示:

# clang hello.c -o hello
# ./hello
sizeof(person) = 16

    开始的char并不会被分配1byte,而是4byte,是为了和相近的int对齐,这就是c语言结构体的内存对齐的具体表现,在linux下,可以通过增加__attribute__((__packed__))在结构体声明的地方,修改上述代码,如下所示:

    

    程序运行,最终的打印结果是13,符合我们原来的预期。 

    还有一种修改办法,就是指定字段对齐大小为1,如下所示:

    

    这两种办法,好像只有在linux下才会生效,在windows下这种办法会报语法错误。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值