精华内容
下载资源
问答
  • 结构体变量所空间的思考

    面试C技术的人在基础笔试时总会被问的问题是变量空间的问题

    尤其是一些混合结构的类型空间

    本次就对其中具有代表性的结构体类型进行说明,便于给长记性

    测试环境: gcc 4.8.1 Ubuntu 13.04 32-bit

    就从以下的实例开始说起:

    struct Pad1{
        char a;
    };
    
    struct Pad2{
        int b;
    };
    
    struct Pad3{
        char a;
        int b:2;
        double c;
    };
    
    struct Pad4{
        char a;
        double c;
        int b:2;
    };

    以上定义了4个结构类型,采用基本的数据类型定义(复杂类型在这个基础上可以扩展)

    提出问题:

    1、以上结构体的大小在32位系统和64位系统的结果是否一致?

    2、大小端存储类型是否有对以上结果是否有影响?

    3、结构体内变量顺序是否对结构体空间大小有影响?有无最小化规律可循?

    4、指针变量类型对结构体有什么影响?

    分析问题:

    根据实践,以上结构体的空间大小(单位:byte)结果为:

    sizeof Pad1 is: 1
    sizeof Pad2 is: 4
    sizeof Pad3 is: 12
    sizeof Pad4 is: 16

    根据以上内容,看到这样的结果最令人奇怪的是两个方面:

    A、Pad3与Pad4变量内容相同(顺序差异),然而结果却不同

    B、定义int b:2 的目的是什么,如果仅定义 int 会有什么不同

    咱们先来说B,定义之所以定义限定位数的整型变量,是因为如果不这样写,两个sizeof的结果相同!

    这就引出了A,当结构体中的变量内容相同,仅顺序不同会有什么什么影响

    回答这个问题需要了解一个前提:内存存储都是整数对齐的,即按照字节或者字对齐

    因此大多数编译器为了迎合这个对齐的功能,在进行编译时会将变量进行对齐处理

    在32bit系统中,按照4个字节进行对齐,因此当出现混合类型的变量时

    sizeof的结果不是简单的累加,而要考虑对齐的扩展,可以确定的是不比理论值小。

    至于大了多少,要看那些变量类型涉及到对齐,以Pad3和Pad4为例

    理论上都是  total =   a:1 + b:2 + c:8 = 11

    Pad3中a和b连续,加起来不足4个字节,因此为了对齐将两者共分配4个字节,

    最终结果为啥是12(4+8)就不难理解了;

    同理,Pad4中因为a与c是连续的,两者加起来是9 不足4的倍数,补足后是12

    加上最后的b(2)是14,再补得16。

    解决问题:

    通过以上分析,回答提出的几个问题:

    1、32位与64位的差别:就是对齐字节数不同,32位是4个字节,64位是8个字节

    所以两者结果有是否会有不同,答案可以自己实践一下。

    2、大小端类型(不明白这个名词的可以搜索一下)对这个所占空间结果没有影响

    但对联合体中变量的赋值会有影响,所以这里特别指出。

    3、变量顺序是否有影响已经在示例中说明了,肯定的说是有的

    但是正如例子中说的之所以有的时候没有影响,那只是因为前后结合后造成的补齐结果相同而已

    例如: 1+ 4 + 8 结合顺序为 5 --》 8  + 8 = 16 ,如果是 1 + 8 + 4 结合顺序为 9 --》 12 + 4 = 16

    虽然都是16 ,但本质是有差别的。

    要使空间最小化,一个常用的参考就是哈夫曼原则,即从小到大进行排序定义变量。

    4、指针类型变量记住一个原则:大小永远是4个字节(64位是8个字节)



    展开全文
  • 原文链接:... 一个结构体变量占多大内存空间的问题   直接来看相同数据结构体的几种书写的格式吧。 格式一: 1. struct tagPhone  2. {  3. char A;  4. int B;  5. ...

    原文链接:http://blog.sina.com.cn/s/blog_75a2ecd20102xca0.html

    一个结构体变量占多大内存空间的问题

     

    直接来看相同数据结构体的几种书写的格式吧。

    格式一:

    1.  struct tagPhone    

    2.  {    

    3.       char   A;    

    4.       int    B;    

    5.       short  C;    

    6.  }Phone1;  

    格式二:  

    1.  struct tagPhone    

    2.  {    

    3.       char   A;    

    4.       short  C;    

    5.       int    B;    

    6.  }Phone2;   

    格式三:  

    1.  struct tagPhone3    

    2.  {    

    3.       char    A;    

    4.       char   B[2];    

    5.       char    C[4];    

    6.  }Phone3;   

    格式四:

    1.  struct tagPhone3    

    2.  {    

    3.       char    A;    

    4.       double  B[2];    

    5.       char    C[4];    

    6.  }Phone4;   

    例题:请问下面定义的结构体变量aa在计算机内存中占用多少字节?

    #include

    main()

    {

    struct  student

    {   float    height;

    short int  age ;

    char     sex ;

    }aa;

    printf("%d\n",sizeof(aa));  //屏幕上将显示多少?

    }

    错误解答:我们都知道,char类型占用1个字节,float型占用4个字节,short int类型占用2个字节,int型在VC6.0中占用4个字节(TC2.0中占用2个字节),long占用8个字节,double占用8个字节。因此,我们可能会犯一个错误就是直接4+2+1=7,结构体aa占用7个字节。这是错的。

    错误分析:计算结构体大小时需要考虑其内存布局,编译系统为了提高计算机访问数据的效率,在安排结构体每个成员的时候采用了内存对齐的方法,具体是:结构体在内存中的存放按单元进行存放,每个单元的大小取决于结构体中最大基本类型的大小

    对格式一:

    图1

    ​​​​因为所有成员中B成员类型最大(int型占用4个字节),故结构体Phone1在内存分布时以4字节为一个单元来存储每个成员。又因为A占用一个字节后,只剩下3字节了,放不下后面紧挨的成员B了,所以必须开辟一个新的单元来存放B,B刚好占满一个单元,接下来的成员C又必须再开辟一个新的单元来存放。这样,Phone1占用的字节数就是:3*4=12;

    同理对于格式二,

    图2

    A后面还有三个字节,足够存放C,所以C就放在了A的后面,然后只剩下一个字节了,不够存放后面的B,于是又开辟一个新单元存放B。这样,Phone2占用的内存字节就为2*4=8。

    对于格式三: 

     图3

    ​上面结构体中,最大数据类型是char,占一个字节,因此它的一个存储单元就是1个字节。sizeof(Phone3) =1 + 2 + 4 = 7, 其大小正好是结构体中各成员所占内存空间之和,这种情况也是最节省存储空间的。

    对于格式四:

    图4

    ​Phone4中最大的数据类型是double,占8个字节,因此它的一个存储单元就是8个字节。由上图可知sizeof(Phone4)=4*8=32。

    综上所述,格式一和格式四是非常浪费存储空间的,应该尽力避免;格式三对存储空间的利用率是最高的;格式二存储空间的利用率居中。作为一个优秀的程序员,应该深入掌握这些写法的差异性,以便视情况选用不同的写法。

    展开全文
  • 结构体变量是指将不同的数据类型整合成一个有机的整体,以便于调用。 struct Student { int num; char name[20]; int score; } Student stud1;//stud1就是结构体变量 结构体指针变量是指指向结构体变量的指针...

    目录

    概念

    内存分配

    对象的引用

    结构体变量和结构体指针变量作形参的区别

    以结构体变量和结构体指针变量形参的函数调用


     

    概念

    结构体变量是指将不同的数据类型整合成一个有机的整体,以便于调用。

    struct Student
    {
        int num;
        char name[20];
        int score;
    }
    
    Student stud1;//stud1就是结构体变量

    结构体指针变量是指指向结构体变量的指针或者指向结构体数组的指针。

    Student *stud2;//结构体指针变量

    内存分配

    在C语言中都是使用库函数malloc和free来分配和撤销内存空间的。C++中提供了较简便而功能较强的运算符new和delete来取代函数malloc和free函数。注意:new和delete是运算符,不是函数。

    int main
    {
        Student *p
        p = new Student    //用new运算符开辟一个存放Student型数据的空间
        .
        .
        .
        delete p;         //使用完之后一定要撤销该空间
        
        return 0;
        
    }

    对象的引用

    结构体变量引用成员变量的方式是:

    结构体变量名.成员变量名

    指针引用结构体变量成员的方式是:

    (*指针变量名).成员变量名 //*指针变量名 两边的括号不可以省略
    
    指针变量名->成员名    //->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。

    结构体变量和结构体指针变量作形参的区别

    结构体变量作为函数形参。此时sc_para和tm_para传递的是两个结构体变量,包含其内部所有的成员变量,占用的内存空间自然而然就大,具体大小取决于结构体变量的大小。

    int REF_STRUCT_PARAM(
                SC_PARAMS sc_para,
                TM_PARAMS tm_para
                )    //SC_PARAMS和TM_PARAMS是两个结构体类型

    结构体指针变量作为函数形参。此时*sc_para和*tm_para传递的是两个指针变量,一个指针只占用四个字节空间,而且存储的是结构体变量的首地址。修改为指针后速度变快,占的内存空间也减小。

    int REF_POINTER_PARAM(
                SC_PARAMS* sc_para,
                TM_PARAMS* tm_para
                )    //SC_PARAMS和TM_PARAMS是两个结构体类型

    以结构体变量和结构体指针变量形参的函数调用

    以结构体变量作形参的函数的调用,函数形参部分直接调用定义的结构体名即可。

    int main
    {
    
        SC_PARAMS sc_para;
        TM_PARAMS tm_para;
    
    
        int REF_STRUCT_PARAM(sc_para, tm_para);  //SC_PARAMS和TM_PARAMS是两个结构体类型
    
        return 0;
    }

    以结构体指针变量作形参的函数的调用,函数形参位置要引用结构体地址。

    
    int main
    {
    
        SC_PARAMS* sc_para;
        TM_PARAMS* tm_para;
    
    
        int REF_POINTER_PARAM(&sc_para, &tm_para);  //SC_PARAMS和TM_PARAMS是两个结构体类型
    
        return 0;
    }

     

     

     

     

     

    展开全文
  • 结构体变量占内存空间大小

    千次阅读 2016-03-21 17:28:08
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    展开全文
  • 自引用的结构体怎么计算占用内存空间,就是定义一个结构体类型,然后里面有各种基本类型的变量还有本结构体类型的指针,这种情况下怎么判断内存空间
  • 如何计算一个结构体所占内存空间大小
  • 在说明一个结构体变量时系统分配给它的存储空间是 B 。 A) 该结构体中第一个成员需存储空间 B) 该结构体中最后一个成员需存储空间 C) 该结构体中占用最大存储空间的成员需存储空间 D) 该结构体中所有成员...
  • 结构体空间占用

    2013-05-11 02:55:25
    从Test这个结构体定义的成员来计算,按照最大字节的变量来对齐空间(为了更好的寻址). 不同的编译器字节占用大小不同. (char a) (char c) (默认对齐字节未修改的情况下) 拿vc编译器来计算可以知道Tes
  • 结构体占用的存储空间计算

    千次阅读 2019-05-26 14:16:14
    结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小 结构体计算要遵循字节对齐原则 ...1) 结构体变量的首地址能够被其最宽基本类型成员的大小整除; 2) 结构体每成员相对于结构...
  • 1.下列程序中,结构体变量n占内存字节数是(答案为6?) union U {  char s[4];   int i;  long l; }; struct A {  int c;  union U u; }a; 2.若有下面的说明和定于: struct test {  int m1;...
  • 显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的...
  • 显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的...
  • C语言中结构体变量到底占多大空间

    千次阅读 2018-09-07 21:56:30
    很久之前就想将内存对齐这块儿知识点总结记录下来,无奈本人患有very very严重的拖拉症,直到今天才下... 结构体到底占多大的空间呢?先看一下下面这道题的输出结果: #include<stdio.h> typed...
  • 定义结构体变量的三种方法

    千次阅读 2018-07-07 20:25:41
    1、先定义结构体类型再定义结构体变量如先定义结构体类型:struct student{ int StuNo;//学号 char StuName[20]; //学生姓名 char Sex; //学生性别 int Agel //年龄}再定义结构体变量: struct student stu1,stu...
  • 结构体在内存中占用空间

    千次阅读 2018-06-03 16:54:32
    之前对结构占用内存一直很迷,下面就举例子,到底是按照哪个变量类型计算内存?应该怎样计算才是正确的呢? struct str { char a; int b; float b; double d; }; 这个结构体占用的内存是多少呢? 运行...
  • 为此,C提供了结构体变量提高表示数据的能力,它能让你创造新的形式。 1、结构体的定义 struct book { char title[40]; //书名 char author[40]; //作者 float price; //单价 }; 在结构体声明中,用一对...
  • struct 结构体变量的内存分配

    千次阅读 2018-06-20 13:13:25
    我们先定义一个结构体 typedef struct { uint32_t num0; // 4 bytes uint16_t num1; // 2 bytes uint16_t num2; // 2 bytes uint32_t num3; // 4 bytes uint64_t num4; // 8 bytes }...
  • 关于计算struct结构体占用空间

    千次阅读 2015-09-26 12:22:25
    关于如何计算struct所占用空间的大小: 有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,...
  • 我们都知道C语言中变量的类型决定了变量存储占用空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。 那么,当我们要做一个学生信息...
  • 结构体变量的内存分配

    千次阅读 2014-07-31 21:21:51
    计算机中的内存存放变量时往往并不是按照一个
  • #define member_size(type, member) sizeof(((type *)0)->member) 说明如下: type:表示结构体类型名。 member:表示结构体成员变量名。 ...(type *) 0:0被强制转换...功能:计算一个结构体成员变量相对于结构..
  • 结构体变量后边带的冒号:

    千次阅读 2014-06-18 14:42:38
    C语言允许在一个结构体中以位为单位来指定其成员占内存长度,这种以位为单位的成员成为“位段”或位域,利用位段能够用较少的位数存储数据。如: struct packed_data (该例子假定int占2个字节,因为在c语言中...
  • 虽然已经了解结构体类型,但是结构体类型变量的定义只有种方法么,这当然不是的,所以我把我知道的几种方法列出来供给大家参考一下;  首先是第种,也是我们经常用的种: 1 #include <stdio.h>...
  • 1、各成员变量存储的启示位置相对于结构体的起始位置的偏移量是这成员变量占用内存空间的整数倍,若不是则会补齐。 2、结构体占用的总的内存空间 是其中占用 内存空间最大的成员变量 的整数倍。 //以下...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言、sizeof(结构体)二、普通结构体1....结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单
  •  今天在调试网络问题时,突然想到了动态数据包,要用到enum来区分...此时想到一个问题"ENUM在结构体占用空间吗"   于是我写了段代码测试了一下 struct Msg {  enum { TAG_SIZE = 3};  enum { TAG_ID =
  • 如何定义结构体变量及如何使用

    千次阅读 2018-10-08 20:05:46
    虽然已经了解结构体类型,但是结构体类型变量的定义只有种方法么,这当然不是的,所以我把我知道的几种方法列出来供给大家参考一下;  首先是第种,也是我们经常用的种: 1 #include &lt;stdio...
  • 今天做一个项目,用到了结构体变量的赋值,但是却一直得不到想要的结果,仔细检查代码,发现了两个和我想的不同的地方: 1、发现是结构体变量间赋值的问题,  两个同类型的结构体变量直接赋值,可以将一个结构体...
  • 对于基本数据类型(比如int,char),他们占用的内存空间一个确定硬件系统下有个确定的值,所以,接下来我们只是考虑结构体成员内存分配情况。 1.1、Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,278
精华内容 18,911
关键字:

一个结构体变量所占用的空间是