精华内容
下载资源
问答
  • struct studen1 { char str; short x; int num; };   struct student2 { char str; int num; short x; }; 答案:sizeof(strdent1) = 8; sizeof(student2) = 12;
      struct studen1

    {

    char str;

    short x;

    int num;
    };

     

    struct student2

    {

    char str;

    int num;

    short x;
    };

    答案:sizeof(strdent1) = 8; sizeof(student2) = 12;


    展开全文
  • struct A { char a; char b; char c; }; struct B { int a; char b; short c; }; struct C { char b; int a; short c; }; pragma pack(2) struct D { ...结构体大小问题在求解的...

    struct A {
    char a;
    char b;
    char c;
    };

    struct B {
    int a;
    char b;
    short c;
    };

    struct C {
    char b;
    int a;
    short c;
    };

    pragma pack(2)

    struct D {
    char b;
    int a;
    short c;
    };

    结构体的大小问题在求解的时候要注意对齐:

    A:对齐值为:1 。大小为:3
    B:对齐值为:4 。 大小为:4+4 = 8(第一个4为int,第二个4为char 和 short ,要空余1个)
    C:对齐值为:4。大小为:4+4+4 = 12(第一个为char ,空余3个,第二个为int ,第三个为char 空余3个)
    D:指定对齐值为:2(使用了#pragma pack(2)) 。大小为2+4+2 = 8。(第一个char,空余1个,第二个为int ,4个,第3个位char,空余1个)。

    展开全文
  • 结构体大小计算有三个原则: 一,结构体变量的首地址,必须是结构体 "最宽基本类型成员" 大小的整数倍(0被认为是任何数的整数倍)。 二,结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍。 三,结构体...

    以下内容摘自此处:
    作者:太平小小草
    链接:https://www.jianshu.com/p/e772fff47465
    来源:简书

    结构体大小计算有三个原则:
    一,结构体变量的首地址,必须是结构体 "最宽基本类型成员" 大小的整数倍(0被认为是任何数的整数倍)。
    二,结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍
    三,结构体的总大小,为结构体 “最宽基本类型成员” (将嵌套结构体里的基本类型也算上,得出的最宽基本类型) 大小的整数倍

    个人理解其中最宽基本类型成员:指的就是占字节数最大的类型成员。下面给出一个表格,方便查看各个类型的字节数:在这里插入图片描述

    下面给出一些计算结构体大小的例子:

    1.简单结构体

    1.1

    struct s1{
    char ch1;
    char ch2;
    int i;
    };
    

    这个结构体的大小容易计算,为8。ch1和ch2共同占4字节,i占4字节,共8字节。

    1.2

    struct s1{
    char ch1;
    int i;
    char ch2;
    };
    

    这个和上面哪个只是结构体成员顺序换了一下,但大小就变成了12。是因为要满足偏移量是成员的整数倍,ch1偏移量是0,i的偏移量不可能是1,因为1不是i(大小4)的倍数,所以i的偏移量是4,ch2的偏移量就变为了8,加ch2是9,要满足结构体大小是成员大小整数倍,就是12。

    2.成员包含数组的结构体

    2.1

    struct s2{
    char ch;
    int i;
    char str[10];
    };
    

    这个结构体的大小是20,先看前两个成员,大小是8,毋庸置疑,这个char类型的数组,只需要把它看做十个char连在一起即可,加起来就是18,再满足结构体大小为成员整数倍,所以大小就是20。
    含数组成员A array[n],就把这个数组看成n个A类型的数据连在一起即可。

    3.嵌套结构体的结构体

    3.1

    struct s3{
        char ch;
        int i;
        struct s{
            char ch1;
            int j;
        }sub;
        float f;
    };
    

    里面这个结构体的大小是8,那么是否结构体大小就要向8对齐呢?这个结构体的大小是20,很明显不是8的倍数。所以计算结构体大小时是把里面这个结构体就看做是一个char,和一个int,不是看做一个整体。
    最宽基本类型成员是j (4位),则
    ch占4个字节,i占4个,ch1占4个,j占4个,f占4个,一共20。

    3.2

    struct s3{
        char ch;
        char i;
        struct s{
            char ch1;
            int j;
        }sub;
        char f;
    };
    

    注意这里结构体(s3)里的结构体(s)内的数据并不能与之前的数据进行内存对齐。
    s里面的ch1与上面的ch,i不能共同占用4个字节,得另外开辟4个字节内存。这点需要注意一下。故大小为4+4+4+4=16而不是4+4+4=12。

    3.3

    struct s3{
        char ch;
        char i;
        struct s{
            char ch1;
            double j;
        }sub;
        char f;
    };
    

    最宽基本类型成员是j (8位),则
    ch和i共占8个字节,ch1占8个,j占8个,f占8个,一共32。

    4.成员包含联合体的结构体

    4.1

    struct s5{
    char ch;
    int i;
    union{
    char ch1;
    int j;
    };
    };
    

    联合体大小就是成员中最大类型的大小,所以这个结构体大小是12.
    4(ch)+4(i)+4(j)=12。

    5.指定对齐值

    指定对齐值:#pragma pack(n) //指定向n对齐
    #pragma pack(n) 若以 #pragma pack()作结束,表示该种对齐方式至此为止。

    5.1对齐值小于最大类型成员值

    #pragma pack(4)  //指定向4对齐 最大是8
    struct s6{
    char ch;
    int i;
    float f;
    double d;
    };
    

    如果我们没有指定对齐值,这个结构体大小是8(ch、i)+8(f)+8(d)=24,我们指定向4对齐,所以大小是4的倍数,所以结构体大小是4(ch)+4(i)+4(f)+4(d)+4(d)=20。

    5.2对齐值大于最大类型成员值

    #pragma pack(10) //指定向10对齐 最大是8
    struct s7{
    char ch;
    int i;
    float f;
    double d;
    };
    

    我们指定的对齐值是10,最大为8,是否就向10对齐?不是,当指定对齐值大于自身对齐值时,向自身对齐值对齐,大小是24,即8(ch、i)+8(f)+8(d)=24。

    总的来说,应向指定对齐值和自身对齐值中较小的那个值对齐。

    展开全文
  • 结构体大小

    千次阅读 2018-07-09 22:47:11
    结构体大小是考试常考也是重点的内容。 结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在...

    结构体大小是考试常考也是重点的内容。

     

     

    结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。然后我们看一个名词,这个名词是从网上看到的定义--偏移量。偏移量指的是结构体变量中的成员的地址和结构体变量地址的差。用一个图来解释

     

    如果是第一个,那么明显105不能整除4,下面的一个空掉三个格子,108就可以整除4,因此应该为8

     

     

     

    下面练习几个:

     

    struct A

    {

    int a;//4

    int b;//4

     

    } //8

     

     

     

    这个结构体长度就是8

     

     

     

    struct C

    {

     

    char a;//1+1

    short b;//2

    int c;//4

    }

    这个结构体大小应该为8

     

    而下面一个例子就不同于上面的了

    struct C

    {

    short a;//2

    char b;//1+5

    double c;//8

    int *d;//4

    float e;//4

    这个结构体的大小就是24.short类型是2,char类型是1,而double类型是8,所以前面要能被8除尽,然后总和。

     

     

    重点来了:

    1.结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍);

    2.结构体大小必须是 “所有”成员大小的整数倍,记住是所有。

    这些都不难从上面看出

     

    下面还有别的类型的例子,一起看看:

    struct EE

    {

    int a;

    float b;

    }

    struct E

    {

    char c;

    struct EE d;//8

    可以自己想想这个结构体大小是多少

     

    是12. 对了吗?看看原因

    int 和 float 都是4,char 是1 ,那么先看E这个结构体,char就应该为1+3,而有人就会算为16,想着EE是8,就还得加4,那就是8+8就是16,不对的。最终值能整除单个最大数据类型,是单个,所以4+8就行了,就是12啦。

    再看看几个吧:

    struct F

    {

    char c;//1+7

    double d;//8

    )//为16

     

    struct G

    {

    int a;//4

    char b;//1

    }那么这个呢也是8,不要以为它是5,看图:

     

     

     

     

     

     

    以数组来说的话105就不可以除尽,不行

    相似例子:

     

     

     

     

     

     

    struct H

    {

     

     

     

    char a;//1+3

     

     

     

    int b;//4

    short c;//2

    }//12

     

     

     

    有人会算为10,不对的 ,前面有说过要是所有成员的整数倍,而10不能除尽4,应为12

    那么,怎么求这个长度呢,对于32位系统来说,用sizeof(char)=1,sizeof(int)=4就ok。

    差不多分析完了,希望对你有用!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • C++ sizeof(struct)计算结构体大小

    千次阅读 2019-08-31 13:07:46
    一、sizeof() 在学习C++的时候会学到一个sizeof操作符,在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的...二、结构体大小 定义一个结构体: struct stru{ char a; int b; float c; double d; }; ...
  • struct结构体大小的计算方法 1)第一个成员处在偏移地址0的地方 2) #include <stdio.h> #pragma pack(4) struct Test1 { //对齐参数 偏移地址 大小 char c1;//1 0 1 short s; //2 2 2 char c2;//1 4 ...
  • c语言struct结构体大小计算

    万次阅读 多人点赞 2019-03-28 14:10:26
    直入主题,要判断一个结构体所占的空间大小,大体来说分三步走: 1.先确定实际对齐单位,其由以下三个因素决定     1> CPU周期     WIN  vs  qt  默认8字节对齐    ...
  • 下面代码的输出结果是: #include <iostream> using namespace std; #pragma pack(4) struct T{ char a; short b; char c; }; #pragma pack() int main() { cout << sizeof(T) <<...
  • C语言结构体大小计算

    2020-10-27 09:19:00
    结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。 结构体内偏移规则 1、每个成员的偏移量都必须是当前成员所占内存...
  • sizeof 结构体大小-1

    2020-11-04 15:26:58
    经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它。 一、为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据...
  • 结构体大小如何计算

    万次阅读 多人点赞 2018-01-08 10:04:22
    由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则: 一、结构体成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍 下面来具体分析 1、简单...
  • struct结构体大小

    2017-07-26 21:36:56
    默认情况下,每个成员相对于结构体变量地址的偏移量正好是该成员类型所占字节的整数倍;且最终占用字节数为成员类型中最大占用字节数的整数倍。 struct A { int a; char b; short c; };A的大小为4+1+1(填充)+2=8 ...
  • 结构体结构体的定义方式结构体大小的计算 结构体的定义方式 //使用方式一 struct 结构体名 { int a; int b; char x; }; //需要分号 struct 结构体名 变量名; //使用方式二 声明与定义同时进行 struct 结构体名 { ...
  • C语言中结构体大小的计算(内存对齐详解)

    千次阅读 多人点赞 2018-03-24 17:13:04
    我们先来计算一下这个结构体大小,如果不存在内存对齐这个问题,按理说这个结构体应该占(1+4+1)6个字节;然而事实上它占了12个字节,为什么?我们需要解决下面几个问题。 1.为什么存在内存对齐 平台...
  • 如何计算结构体大小

    千次阅读 2019-03-11 19:44:35
    结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率。在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员按照其声明顺序在...
  • 结构体嵌套,结构体大小,内存对齐结构体嵌套结构体类型的小大内存对齐总结 结构体嵌套 我们继续说明C语言结构体的基本知识,接下来我们说明结构体嵌套,结构体嵌套的意思就是说在结构体里面使用结构体,接下来我们...
  • 结构体大小的计算方法 相信来看这里的小伙伴们,应该都知道了计算一些基本类型的数据的大小。 比如,int 占4个字节 ,char 占1个字节 ,short 占2个字节等等。那么结构体的大小怎么计算呢? 要想知道结构体大小是...
  • 当你点进这篇文章或许是正带着疑惑而来的,或者曾碰到过结构体大小飘忽不定不知道怎么计算,又或许你还没有遇到过这样的问题,不过也没关系所谓未雨绸缪也不是一件坏事,今天就来给大家讲一下C...
  • 示例:计算结构体大小 结构体中可以定义的数据类型: 1.基本类型:基本类型是指像char、short、int、float、double这样的内置数据类型,诸如结构体、共用体和数组等都不是基本数据类型。 2.上面已经出现过的...
  • Struct结构体的成员存放以及空间大小 今天看《C和指针》这本书时,书中10.3结构的存储分配一小节提到了结构体的存放规则。于是突然心血来潮,想要实际测试一下结构体的空间占用、成员内存存放情况。 测试IDE,...
  • C语言 如何计算结构体大小

    千次阅读 多人点赞 2020-11-24 16:24:36
    由于存储变量地址对齐的问题,计算结构体大小的3条规则: 1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐) 2、结构体变量中的每个成员相对于结构体首地址的偏移...
  • 计算结构体大小也就是其sizeof的大小 需要遵守的规则是: 1、结构体大小结构体变量的存储首地址,必须是内部最宽基本数据类型长度的整数倍。 2、每个成员相对于结构体首地址的偏移量,必须是其数据类型...
  • 判断结构体大小的方法

    千次阅读 2018-05-05 18:02:04
    1.创建一个结构体类型:typedef struct A { char a; int b; }A;Char类型占1个字节,int占4个,所以容易误判为struct A占五个字节。假如计算机是按照这个来在内存中存储数据:上方的数字代表了地址,每个格子代表一...
  • 结构体,是c语言中能面向对象编程的重要支撑,因而在c语言编程中被广泛应用,因而在嵌入式工作的笔试题中经常出现结构体大小计算类型的题目,下面让我们来看看结构体大小计算的具体细节。 由于存储变量地址对齐的...
  • 32位系统环境下结构体大小

    千次阅读 2017-08-23 19:56:18
    double 8个字节 int 4个字节 float 4个字节 short 2个字节 char 1个字节 enum {green,red,black} color; 占4个字节不管枚举多少个 union 联合体所占字节数为,里边包含最大的一个。...+特例:结构体数组的计算方法
  • 结构体大小问题

    2018-05-17 19:52:36
    在讨论结构体大小前我们先回顾一下结构体的一些小知识,结构体作为一种自定义类型很方便的解决了同意存储区域内存储多个数据类型的问题,结构体的一个特别之处是在定义完成之后相当于内置类型,可以在另一个结构体的...
  • C代码中定义的结构体是一块连续内存,各成员按照定义的顺序依次在其中存放。编译器在完成语法分析后,需要计算它的大小,然后才能正确地为结构体分配空间。...我们通过以下几个例子认识结构体大小知识: 1、 ...
  • 一、结构体内存实际对齐单位(自定义)计算 (1) CPU周期 WIN (win32/x64) vs qt 默认8字节对齐 Linux 32位 默认4字节对齐,64位默认8字节对齐 (2) 结构体最大成员(基本数据类型变量(包括嵌套的内部结构体中的基本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,796
精华内容 41,118
关键字:

下面结构体的大小是多少