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

Myth丶恋晨 2022-11-18 01:58 220阅读 0赞
  1. c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的大小会发生改变,下面给出一个示例:
  2. #include <stdio.h>
  3. struct person{
  4. char sex;
  5. int age;
  6. char name[8];
  7. };
  8. int main()
  9. {
  10. printf("sizeof(person) = %d\n",sizeof(struct person));
  11. return 0;
  12. }
  13. 这个示例很简单,就是定义一个结构体,三个属性:分别是char类型的sex,int类型的agechar\[\]类型的name,直观的看,大小应该是1+4+8=13,但是我们编译,运行,结果如下所示:
  14. # clang hello.c -o hello
  15. # ./hello
  16. sizeof(person) = 16
  17. 开始的char并不会被分配1byte,而是4byte,是为了和相近的int对齐,这就是c语言结构体的内存对齐的具体表现,在linux下,可以通过增加\_\_attribute\_\_((\_\_packed\_\_))在结构体声明的地方,修改上述代码,如下所示:
  18. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70][]
  19. 程序运行,最终的打印结果是13,符合我们原来的预期。
  20. 还有一种修改办法,就是指定字段对齐大小为1,如下所示:
  21. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaW5pZmk_size_16_color_FFFFFF_t_70 1][]
  22. 这两种办法,好像只有在linux下才会生效,在windows下这种办法会报语法错误。

发表评论

表情:
评论列表 (有 0 条评论,220人围观)

还没有评论,来说两句吧...

相关阅读

    相关 结构体内对齐

    结构体内存对齐规则 > 1. 第一个成员在与结构体变量偏移量为0的地址处。 > 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 > 对齐数 = 编

    相关 c语言结构体内对齐问题

        c语言中结构体使用是非常广泛的,但是结构体有一个问题,就是如果开头的字段属性是字符类型(char),紧跟着的是其他类型,比如整型、长整型、双精度、浮点型,这时候结构体的

    相关 676-为什么要进行结构体内对齐

    为什么要进行结构体内存对齐? 1、平台移植型好 不是所有的硬件平台都能访问任意地址上的数据;某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常,及遇

    相关 关于结构体内对齐总结

    内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。(编译环境为vs2015)