精华内容
下载资源
问答
  • 如题,我定义了一个结构体,为什么结构体变量所占的空间跟他成员占用空间总和不一样呢?#include<stdio.h> int main() { struct student { int no; char num[10]; char a; int b; }stu; ...
  • 结构体变量所空间的思考

    面试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个字节)



    展开全文
  • 结构体变量和结构体指针作形参的区别 含结构体变量和结构体指针变量形参的函数调用 指针和数组作为函数形参的区别 概念 结构体变量是指将不同的数据类型整合成一个有机的整体,以便于调用。 struct Student { ...

    目录

    概念

    内存分配

    对象的引用

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

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


     

    概念

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

    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
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    结构体变量占内存空间大小 - 光 - 一只半路出家的程序猿
     
    展开全文
  • 自引用的结构体怎么计算占用内存空间,就是定义一个结构体类型,然后里面有各种基本类型的变量还有本结构体类型的指针,这种情况下怎么判断内存空间
  • 您好,您的问题是不是有点略多,下面一一为您解答:1、typedef char **HuffmanCode 实际上是typedef (char *) *HuffmanCode。写成这种形式更好理解, *...2、*HuffmanTree表示指向结构体HTNode的指针,HTNode是typed...

    您好,您的问题是不是有点略多,下面一一为您解答:

    1、typedef char **HuffmanCode 实际上是typedef (char *) *HuffmanCode。写成这种形式更好理解, **HuffmanCode是指向指针的指针,这里也可以理解为是指向字符串的指针,因为char*字符数组相当于字符串。

    2、*HuffmanTree表示指向结构体HTNode的指针,HTNode是typedef语法指定的结构体的别名,然后*HuffmanTree是在定义结构体的同时定义了指向结构体的指针。

    3、指针只是一个地址,HuffmanTree作为结构体指针同样是一个地址,因此不存在它内部有4个变量一说。严格意义上讲是HuffmanTree这个指针指向的结构体中有这4个变量,而这4个变量和在main函数里定义的普通变量一样,都占用实际内存,在新建结构体的同时为这4个变量分配内存空间。

    4、HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))。这个是malloc的语法,该语句的含义是分配m+1个HTNode结构体占用的内存,将分配的内存地址赋给HT。sizeof作用是判断某个类型所占用的内存空间,此处是计算HTNode占用的空间大小,然后(m+1)*sizeof(HTNode)表示m+1个HTNode,malloc是请求分配内存,(HuffmanTree)是强制类型转化,将得到的内存地址强制转化为HuffmanTree(即HTNode指针类型)。

    5、malloc是C语言中常用的动态分配内存的语法,划重点“动态”,当你需要动态申请内存时(例如给数组扩容,还有此处的为结构体申请空间)时用到该语法,C语言中内存相关语法还有realloc,free可以自行了解一下。在C++中new和delete更为常用。

    展开全文
  • 背景 cpu读取内存是以2的整数次幂为单位读取(一次读取一块内存,如一次读入4个字节),如果不进行对齐,...结构体最大成员(基本数据类型变量) 预编译指令#pragma pack(n)手动设置 n–只能填1、2、4、8、16 CPU...
  • 结构体 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的...结构体变量占用存储空间大小 struct Person{ int age; // 4 第
  • 结构体空间占用

    2013-05-11 02:55:25
    从Test这个结构体定义的成员来计算,按照最大字节的变量来对齐空间(为了更好的寻址). 不同的编译器字节占用大小不同. (char a) (char c) (默认对齐字节未修改的情况下) 拿vc编译器来计算可以知道Tes
  • 结构体ss单独计算占用空间为8,而stu5的sizeof则是20,不是8的整数倍,这说明在计算sizeof(stu5)时,将嵌套的结构体ss展开了,这样stu5中最大的成员为ss.j,占用4个字节,20为4的整数倍。如果将ss当做一个整体,结果...
  • 结构体ss单独计算占用空间为8,而stu5的sizeof则是20,不是8的整数倍,这说明在计算sizeof(stu5)时,将嵌套的结构体ss展开了,这样stu5中最大的成员为ss.j,占用4个字节,20为4的整数倍。如果将ss当做一个整体,结果...
  • 很久之前就想将内存对齐这块儿知识点总结记录下来,无奈本人患有very very严重的拖拉症,直到今天才下决心将这件事儿解决掉,废话... 结构体到底占多大的空间呢?先看一下下面这道题的输出结果: #include<st...
  • 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;...
  • 结构体占用的存储空间计算

    千次阅读 2019-05-26 14:16:14
    结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小 结构体计算要遵循字节对齐原则 ...1) 结构体变量的首地址能够被其最宽基本类型成员的大小整除; 2) 结构体每个成员相对于结构...
  • 定义结构体变量的三种方法

    千次阅读 2018-07-07 20:25:41
    1、先定义结构体类型再定义结构体变量如先定义结构体类型:struct student{ int StuNo;//学号 char StuName[20]; //学生姓名 char Sex; //学生性别 int Agel //年龄}再定义结构体变量: struct student stu1,stu...
  • 结构体变量说明:(1)在声明结构体时,系统不给该结构体分配内存空间,仅是定义了一种特定的数据构造类型,它制定了这种结构体使用内存的模式。 (2)结构体可以在函数内部定义,也可以在函数外部定义,其作用域是不同...
  • 原文链接:... 一个结构体变量占多大内存空间的问题   直接来看相同数据结构体的几种书写的格式吧。 格式一: 1. struct tagPhone  2. {  3. char A;  4. int B;  5. ...
  • 在C语言中我们如何去运用结构体变量和结构的变量的指针作为函数的参数呢,其实我们对于结构体的变量是有一定的了解的,他们就是将一个结构体变量的值传递给另外一个函数,那么这种有三种方法,希望大家都能够了解...
  • 为此,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 }...
  • 结构体变量后边带的冒号:

    千次阅读 2014-06-18 14:42:38
    结构体变量后边带的冒号: 结构体中变量后面带有冒号的意义 变量:数字 属于C语言的位段操作可以控制单个的位 C语言允许在一个结构体中以位为单位来指定其成员占内存长度,这种以位为单位的成员...
  • 我们都知道C语言中变量的类型决定了变量存储占用空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。 那么,当我们要做一个学生信息...
  • 虽然已经了解结构体类型,但是结构体类型变量的定义只有一种方法么,这个当然不是的,所以我把我知道的几种方法列出来供给大家参考一下;  首先是第一种,也是我们经常用的一种: 1 #include <stdio.h>...
  • 结构体变量的内存分配

    千次阅读 2014-07-31 21:21:51
    计算机中的内存存放变量时往往并不是按照一个
  • 如何定义结构体变量及如何使用

    千次阅读 2018-10-08 20:05:46
    虽然已经了解结构体类型,但是结构体类型变量的定义只有一种方法么,这个当然不是的,所以我把我知道的几种方法列出来供给大家参考一下;  首先是第一种,也是我们经常用的一种: 1 #include &lt;stdio...
  • 今天做一个项目,用到了结构体变量的赋值,但是却一直得不到想要的结果,仔细检查代码,发现了两个和我想的不同的地方: 1、发现是结构体变量间赋值的问题,  两个同类型的结构体变量直接赋值,可以将一个结构体...
  • 结构体在内存中占用空间

    千次阅读 2018-06-03 16:54:32
    之前对结构占用内存一直很迷,下面就举个例子,到底是按照哪个...这个结构体占用的内存是多少呢? 运行结果为什么是24,而不是17呢? 这是因为为了CPU能够快速的访问,提高访问效率,变量的起始地址应该具有某些...

空空如也

空空如也

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

结构体变量所占用空间