C语言结构体计算内存占用问题解析

 更新时间:2021年07月01日 16:57:04   作者:luffy5459  
这篇文章主要介绍了C语言结构体计算内存占用问题解析,本文通过案例来解析了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下这种办法会报语法错误。

到此这篇关于C语言结构体计算内存占用问题解析的文章就介绍到这了,更多相关C语言结构体内存占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++发送邮件实现代码

    C++发送邮件实现代码

    这篇文章主要为大家详细介绍了C++发送邮件的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • c++中for双循环的那些事

    c++中for双循环的那些事

    本人很菜,今天看《C++编程思想》中的一道课后题中说到这样一个问题。修改两层嵌套的for循环的标识符,观察结果变化
    2013-05-05
  • C++ 流插入和流提取运算符的重载的实现

    C++ 流插入和流提取运算符的重载的实现

    这篇文章主要介绍了C++ 流插入和流提取运算符的重载的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 详解c++中的异常

    详解c++中的异常

    程序在运行过程中,有对也就有错,正确那么就不用说了,但是如果错误,那么我们如何快速的定位到错误的位置,以及知道发生了什么错误。当一个函数发现自己无法处理的异常,就会抛出一个异常,让函数调用者直接或者间接的处理这个错误。本文将详解介绍c++中的异常
    2021-06-06
  • 在编程语言中怎样定义队列及其使用(C++)

    在编程语言中怎样定义队列及其使用(C++)

    这篇文章主要介绍了在编程语言中怎样定义队列,本文主要根据c++来介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • C++中的while循环和for循环语句学习教程

    C++中的while循环和for循环语句学习教程

    这篇文章主要介绍了C++中的while循环和for循环语句学习教程,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 解决在Mac下直接解压C++静态库出现的问题

    解决在Mac下直接解压C++静态库出现的问题

    最近在研究C++的各种编译构建过程,学习了一下cmake,gyp/ninja这些自动化构建工具后,想着自己试下用纯命令行跑一遍编译流程。在试图把C++静态库编译为动态库的过程中遇到了棘手的问题,找了好久后发现是跟Mac平台相关的,这里记录一下,望对遇到类似问题的童鞋有帮助。
    2016-12-12
  • 详解C++中的常量

    详解C++中的常量

    这篇文章主要介绍了C++中的常量的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++中宏的使用问题详解

    C++中宏的使用问题详解

    宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为“预处理器”的模块,这个模块将宏根据编译参数和实际编码进行展开,展开后的代码才正式进入编译器,进行词法分析、语法分析等等。
    2016-05-05
  • c语言判断是否素数程序代码

    c语言判断是否素数程序代码

    这篇文章主要介绍了c语言判断是否素数的方法和问题,大家参考使用吧
    2013-11-11

最新评论