精华内容
下载资源
问答
  • C语言结构体占用内存总结

    千次阅读 多人点赞 2020-12-02 11:17:01
    C语言结构体占用内存总结 前几天有个小朋友问了我一下,关于C语言结构体占用空间的问题。觉得以后会对小可爱有点帮助,就打算先写一下。 struct Test { int a; char b; int c; } test; 理论上,结构体中的各个...

    C语言结构体占用内存总结

    前几天有个小朋友问了我一下,关于C语言结构体占用空间的问题。觉得以后会对小可爱有点帮助,就打算先写一下。

    struct Test
    {
        int a;
        char b;
        int c;
    } test;
    

    理论上,结构体中的各个成员在内存中应该是连续储存的,就像数组里面的元素一样。事实上,也确实是这个样子的,不过和我们想象的有点不一样。
    按照我们最初的想法,变量test所占的内存为 4 + 1 + 4 = 9。
    但是我们写一个小代码验证一下发现和我们想的不一样。

    在这里插入图片描述
    它的内存为12。因为 int类型是4个字节,所以是不是各个成员的内存都是按照最大的那个设置呢?毕竟 4 * 3 = 12,我们再次实验,
    在这里插入图片描述
    如果按照我们的推测,那么内存大小应该是 8 * 3 = 24。为何是16呢?
    下面我来总结一下。

    总结

    C语言结构体所占内存大小,其实里面涉及到C语言内存对齐,提高寻址效率的一种思想在里面。具体我就不在这里展开来说了,有兴趣的可以自己百度了解一下。

    其实小可爱最想了解的应该是如何计算,结构体的内存大小。

    • 不包含,数组和指针的结构体

    对于不包含,数组和指针的结构体,知道各个成员所占内存大小后,可以直接相加,不过相加的时候必须保证前面的成员变量的内存所占内存必须是下一个成员变量所占内存的整倍数,如果不够就补上;并且最后的结果必须要是所占内存空间最大的成员变量的整倍数
    下面我来几个例子说明:

    struct Test
    {
        double c; 	//8
        int a;		//4
        char b;		//1
    } test;
    

    所占内存大小,8 + 4 + 1 = 13,最大内存为8, 所以应该这样计算 8 + 4 + 4 = 16。
    下面我们交换下,

    struct Test
    {
        int a;		//4
        double c; 	//8
        char b;		//1
    } test;
    

    所占内存大小, 4 + 8 + 1 = 13,因为double类型是8个字节,而前面只有4个字节,并且成员变量最大内存为8,所以应该这样计算 8 + 8 + 8 = 24。

    struct Test
    {
        int a;		//4
        char b;		//1
        double c; 	//8
    } test;
    

    同理4 + 1 + 8 = 13,应该变为 4 + 4 + 8 = 16。

    • 包含,数组和指针的结构体
      • 包含指针的结构体
        对于包含指针的结构体,可以用和上面相同的方法进行计算,一般指针的大小都是固定的4个字节(在我的电脑上,你们可能不同),因为不管什么类型的指针只需要储存地址,不需要储存地址指向空间的内容。
      struct Test
      {
          char a;		//1
          char *b;	//4
          double c;	//8
      } test;
      struct Test
      {
          char a;		//1
          int *b;	//4
          double c;	//8
      } test;
      struct Test
      {
          char a;		//1
          double *b;	//4
          double c;	//8
      } test;
      
      这三种所占内存大小均为 4 + 4 + 8 = 16。如果将变量 b 和变量 c 的位置互换,则变为 8 + 8 + 8 = 24。
      • 包含数组的结构体
        数组中的元素地址是连续的,所以一个数组所占空间大小,为数组类型 * 元素个数。
        知道了数组所占空间大小后,再来说说如何计算结构体中包含数组的情况,在之前计算的时候,我说过相加的时候必须保证前面的成员变量的内存所占内存必须是下一个成员变量所占内存的整倍数,但是如果下一变量为数组,则没有这个要求。
        例如:
    struct Test
    {
        int a;
        char b[21];
        int d;
        double c;
    } test;
    

    应该为 4 + 24 + 4 + 8 = 40。

    struct Test
    {
        int a;
        char b[19];
        int d;
        double c;
    } test;
    

    应该为 4 + 20 + 8 + 8 = 40。

    struct Test
    {
        char a;		//1
        char b[19];	//19
        int d;		//4
        double c;	//8
    } test;
    

    应该为 1 + 19 + 4 + 8 = 32。

    struct Test
    {
        char a;		//1
        char b[17];	//17
        int d;		//4
        double c;	//8
    } test;
    

    应该为 1 + 19 + 4 + 8 = 32。

    struct Test
    {
        char a;		//1
        char b[15];	//15
        int d;		//4
        double c;	//8
    } test;
    

    应该为 1 + 15 + 8 + 8 = 32。

    希望可以对你有一些帮助,记得点赞加关注哦!!!
    不然下次找不到了!!!!

    展开全文
  • 前几天有个小朋友问了我一下,关于C语言结构体占用空间的问题。觉得以后会对小可爱有点帮助,就打算先写一下。 struct Test { int a; char b; int c; } test; 理论上,结构体中的各个成员在内存中应该是连续...
  • 结构体(struct)类型占用内存空间的计算方法: 首先需要确定是在32位系统,还算在64位系统  是所有成员的内存的和,但是需要注意,默认情况下是按照32位4字节对齐的,64位系统是根据最大变量的长度确定对齐的,...

    共用体(union)所占的字节数是最大的成员内存。


    结构体(struct)类型占用的内存空间的计算方法:


    首先需要确定是在32位系统,还算在64位系统

        是所有成员的内存的和,但是需要注意,默认情况下是按照32位4字节对齐的,64位系统是根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐
        32系统4字节对齐时,如下分析:
        每行4个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和folat,以及long,double按照4个字节4个字节存储
        64位系统4字节对齐时,和32位系统一样。
        64位系统8字节对齐是,如下分析:
        每行8个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和float,按照4个字节4个字节的存储,long和double型按照8个字节8个字节的存储
        只有结构体中有2个以上的数据时,才考虑对齐问题,如果只有一个,这个类型长度是多少,结构体长度就是多少
        **只有在有2个以上成员时才需要对齐,对齐时按照最长类型对齐,但是也需要考虑系统的位数,如果是32位系统,最多4字节对齐,如果64位系统,按照最长类型的字节数对齐
        *结构体和共用体指针的长度在32位系统上是4,在64位系统上是8


         *如果是32位,最多32位,4字节对齐,
         *如果是64位,最大对齐位数是结构体中最长的数据类型,不受64位系统长度的限制,比如可以按照long double 16位对齐
    展开全文
  • 结构体类型占用内存空间的计算方法: 首先需要确定是在32位系统,还算在64位系统  是所有成员的内存的和,但是需要注意,默认情况下是按照32位4字节对齐的,64位系统是根据最大变量的长度确定对齐的,如果...

    结构体类型占用的内存空间的计算方法:

    首先需要确定是在32位系统,还算在64位系统

        是所有成员的内存的和,但是需要注意,默认情况下是按照32位4字节对齐的,64位系统是根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐
        32系统4字节对齐时,如下分析:
        每行4个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和folat,以及long,double按照4个字节4个字节存储
        64位系统4字节对齐时,和32位系统一样。
        64位系统8字节对齐是,如下分析:
        每行8个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和float,按照4个字节4个字节的存储,long和double型按照8个字节8个字节的存储
        只有结构体中有2个以上的数据时,才考虑对齐问题,如果只有一个,这个类型长度是多少,结构体长度就是多少
        **只有在有2个以上成员时才需要对齐,对齐时按照最长类型对齐,但是也需要考虑系统的位数,如果是32位系统,最多4字节对齐,如果64位系统,按照最长类型的字节数对齐

        *结构体和共用体指针的长度在32位系统上是4,在64位系统上是8

         *如果是32位,最多32位,4字节对齐,
         *如果是64位,最大对齐位数是结构体中最长的数据类型,不受64位系统长度的限制,比如可以按照long double 16位对齐
    展开全文
  • C语言结构体占用内存问题之前对结构体占用内存一直很混乱,到底是按照哪个变量类型计算内存?还是怎么计算?下面先看一个例子:1234567struct str1 { char a; int b; float c; double d; };str1这个...

    C语言中结构体占用内存问题

    之前对结构体占用内存一直很混乱,到底是按照哪个变量类型计算内存?还是怎么计算?下面先看一个例子:

    1
    2
    3
    4
    5
    6
    7
    struct str1
        {
            char a;
            int b;
            float c;
            double d;
        };

    str1这个结构体占用的内存是多少呢?如果用变量类型直接想加,得到的结果是17,但显然不是这样的。这个程序运行的正确结果是24.为什么呢?

      因为为了CPU能够快速访问,提高访问效率,变量的起始地址应该具有某些特性,这就是所谓的“对齐”。比如4字节的int型变量,那它的起始地址就应该在4字节的边界上,即起始地址可以被4整除。

      内存对齐的规则很简单:

      1.起始地址为该变量类型所占内存的整数倍,若不足则不足部分用数据填充至所占内存的整数倍。

      2.该结构体所占总内存为结构体成员变量中最大数据类型的整数倍。

      接下来我们分析上面的例子:

      char型变量占一个字节,所以它的起始地址为0,而int类型占4个字节,它的起始地址应该是4(的整数倍),那么内存地址1、2、3就需要被填充。同样,float占用4个字节,而结构体中a,b两个成员变量占了0~7内存地址,c的地址从8开始,符合规则一,占用内存地址为8~11。double类型占8个字节,所以d的起始地址就应该从16开始,那么12、13、14、15内存地址就需要被填充。d从16地址开始,占用8个字节。整个结构体占用字节数为24,符合规则二。内存分配如图:红色区域为填充部分

    下面再举一个例子,进一步说明:

     

    1
    2
    3
    4
    5
    6
    7
    struct str2
        {
            double a;
            int b;
            char c;
            double d;
        };

    str2这个结构体占用的内存空间是多少呢?是24!怎么分析呢?

    首先double类型的a占用内存地址为0~7,int类型的b起始地址为8,符合规则一,占用地址为8~11,char类型的c占一个字节,地址为12.那么double类型的d,起始地址为13吗?显然不是,满足规则一的地址是16,所以d起始地址为16,占用16~23。结构体总共24个字节,满足规则二。如果这个结构体最后再加一个成员变量 char e,那这个结构体占用的内存是多少?char类型的e起始地址为24,占用地址为24,但是结构体一种有25个字节,就不满足规则二了,怎么办呢?为了满足规则二,我们将25~31进行填充,因此整个结构体占用32个字节。


    展开全文
  • C语言结构体占用内存大小

    千次阅读 2018-09-20 16:06:44
    这个问题很经典,很容易出现,也叫内存的4k对齐吧   相关知识: cpu传输数据的方式: cpu每次传输数据大小由它的总线条数决定,32位传输4个字节,64位传输8个字节。 这里以64位系统举例,若声明一个变量大小为...
  • 在说结构体之前有必要先说一下在不同编译器中各变量所占内存字节大小:  1、32位编译器下,即X86环境下   指针类型都是占用4个字节,如char* 、int*、double* 2、对于64位系统即X64环境,64位编译器下: 指针...
  • 普通数据类型比如int char float 我们很清楚知道它们占用几个内存,比如int占用4个字节,char占用一个字节等等,知道数据类型占用多少内存是很重要的,...之前对结构体占用内存一直很混乱,到底是按照哪个变量类型计...
  • C语言结构体内存对齐

    2020-05-12 10:09:53
    C语言结构体内存对齐 结构体是C语言常用的数据结构,它也是C语言支持的唯一一种聚合类型。在编译器为某个结构体分配的时候,原来相邻的的成员的内存却未必是相邻的。这是怎么回事呢?请往下看。 观察一下下面的...
  • C语言结构体

    2019-03-13 20:12:42
    C语言结构体 什么是结构体:简言之,就是...结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间; struct Student{ int id; char name[50]; int age; }; //注意:分号一定不能少 定义结构体变量...
  • C语言 结构体

    2019-04-27 12:00:46
    结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。 如: struct st1 { int a;...
  • C语言中,在默认情况下,编译器规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量...所以,在计算结构体变量的大小时: ①上面的所有字节数的总和,必须是下一个类型的整数倍数。 ②总字节...
  • C语言结构体存储 内存对齐问题

    千次阅读 2012-05-11 18:30:46
    1)内存对齐产生的原因 内存空间是按照字节来划分的,从理论上对内存空间的访问可以从任何地址开始。 但是在实际上不同架构的CPU为了提高访问内存的速度,就...一个变量占用 n个字节,则该变量的起始地址必须能够被
  • C语言结构体的应用

    千次阅读 2019-04-02 10:36:08
    结构体本身是一种数据类型,声明一个结构体占用内存 使用结构体之前必须先声明,声明结构体使用struct关键字 声明语法: struct 结构体类型名{ 结构体成员类型 成员变量名; ....... }; 结构体声明语法中的成员...
  • C语言结构体对齐

    2019-09-11 14:37:59
    (1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间...
  • 结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间,和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。 2. 如何...
  • C语言结构体对齐问题

    2012-04-10 13:22:38
    一个变量占用n 个字节,则该变量的起始地址必须能够被n 整除,即: 存放起始地 址% n = 0,对于结构体而言,这个n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间是按照字节来划分的,...
  • C语言当中的结构体内存对齐基本上是笔试中必考的问题,一般都是给你一个结构体,问你这个结构体占用多少个字节。今天就来深入分析一下可能涉及到的各种情况。 一、什么是结构体C语言中,可以使用结构体...
  • c语言结构体内存分配问题 c语言结构体内存分配问题本文章是转载而来,特此声明 有些c语言的题很小,但是我们往往会忽略掉,面试的时候就会出这样的题比如,写出一个struct,然后sizeof,你会不会经常对结果...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 221
精华内容 88
关键字:

c语言结构体变量占用内存

c语言 订阅