精华内容
下载资源
问答
  • struct结构体相关用法

    2019-07-22 10:49:48
    结构体struct)是由不同类型数据组成的数据结构。它的本质是一种数据结构。 struct haha { char a; int b; int *c; ····· }mystruct; 结构体定义的时候如以上格式,“haha”是我们定义的结构体的“体...

    关键字struct

    结构体(struct)是由不同类型数据组成的数据结构。它的本质是一种数据结构。

    struct haha
    {
        char a;
        int b;
        int *c;
        ·····
    }mystruct;
    
    • 结构体定义的时候如以上格式,“haha”是我们定义的结构体的“体名”,而“mystruct”是结构体类型的变量名。希望同学们注意:在引用结构体变量时,勿把结构体的名字当成变量名使用。
    mystruct.a;   //访问成员变量a
    haha.a;    //错误写法
    
    • 当我们定义结构体不写结构体的“体名”的时候,我们称其为无名结构体。定义一个无名结构的时候,应将变量一同写出,否则在后面的代码编写中你会发现,无法通过这个结构体再次定义变量。因为它没有名字啊,系统不知道去哪找对应的结构体。
    struct               //无名结构体 
    {
        char a;
        int b;
        int *c;
        ·····
    }mystruct1, mystruct2;
    
    • 调皮的同学会如下定义,这个时候要注意:当结构体成员变量中包含结构体类型的指针时,这个指针只能指向这个结构体的本身,不能指向其他的结构体!
    struct haha
    {
        struct *a;
        ·····
    }mystruct;
    

    接下来涉及关于结构体比较重要的一个概念——字对齐

    字对齐是一种为了方便CPU读取数据而存在的特殊规则。以空间换取时间。为了在可接受的空间浪费的前提下,尽可能提高对相同过程的最快处理。

    系统默认的对齐规则至少有两点:
    1.变量的最高效加工。
    2.在达到条件 1 的前提下使用最少的空间。

    字对齐的原则

    1.数据类型自身的对齐值:即“sizeof(基本数据类型)”。
    2.指定对齐值:系统默认的对齐值(32系统为4字节)
    3.结构体本身的对齐值:成员中自身对齐值最大的那个值
    4.有效对齐值:有效对齐值N是表示对齐在N地址上,若 “ 当前内存地址N % 数据类型自身的对齐值==0 ”则在内存上排放该成员,否则补空格,直到当前内存地址能够整除此时需要排放的数据成员。注意:计算占用内存大小时别忘记把空格算上。
    5.在最后一个成员排放好后,还要根据结构体本身的对齐值来补齐空格对齐!!
    6.如果在一个结构体中还嵌套有结构体,则嵌套的结构体按照自己本身的对齐规则计算好大小,再当做一个成员来进行排放
    实例:

    struct A
    {
    	char c;   // 占 1字节
    	int d;    //空 3字节,占 4字节
    	short e;  //占 2字节,补 2字节
    };sizeof(A)== 12
    
    struct B
    {
    	char c;   //占 1字节
    	_int64  d;  //  空 7字节,占 8字节
    	int e;    //占 4字节
    	short f;   //占 2字节
    	A g;  // 空 2字节,占 12字节
    	char h; //占 1字节
    	int i; //空 3字节,占 4字节。末尾空 4字节
    };sizeof(B)== 48
    
    

    如果你能弄明白上面这个实例,字对齐原则相信你已经掌握了。

    展开全文
  • 要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
  • struct结构体的多种声明方式

    千次阅读 2019-10-15 12:03:58
    本文讲述struct union结构体的声明方式

    结构体声明

    方法1

    在声明结构体时,必须列出它包含的所有成员
    语法结构 struct tag { member-list} variable-list;

    struct {
    		int a ;
    		float b;
    		double c;
    		short d;
    		
    }x;
    

    这个声明创建名为X的变量,它包含四个成员。


    struct {
    		int a ;
    		float b;
    		double c;
    		short d;
    		
    }y[20],*z;
    

    这个声明创建名为y和Z的指针变量,y是一个数组,它包含20个结构。Z是一个指针,指向这类型的结构。

    这两个声明是截然不同的类型,即使他们的成员列表完全相同,因此 z = &x是非法的


    方法2

    /*标签 类似于面包形状模板,它给定了制作出来的面包的形状,但是它没有制作出面包*/ 
    struct  SIMPLE {
    		int a ;
    		float b;
    		double c;
    		short d;
    		
    };
    
    /*利用上述的标签(面包模板),制作出一个面包(SIMPLE 类型的结构体)*/
    struct SIMPLE x;
    struct SIMPLE y[20],*z;
    

    标签标识了一种模式,用于声明未来的变量,但是无论标签还是模式
    本身都不是变量,这个和方法1的最大区别—x,y,z是同一种类型的结构体变量


    方法3

    最常用的使用技巧typedef 创建一种新的类型
    typedef struct{
    		int		a;
    		char 	b;
    		float	c;
    		
    } Simple;
    

    这个技巧和声明一个结构体标签的效果几乎相同,区别在于Simple现在是类型名
    而不是个结构标签,

    struct Simple x;
    struct Simple y[20],*z;
    

    结构体的访问

    声明结构体
    struct Simple x,*z; //声明一个 结构体变量x,和一个指向结构体变量的指针。
    
    访问变量x的结构体成员
    x.a;
    x.b;
    x.c;
    
    访问指针Z
    z->a;
    z->b;
    z->c;
    

    结构体的自引用

    结构体的自引用就是在一个结构体内部包含这个结构体本身。
    
    struct SELP_REF1{
    		int 	a;
    		struct SELP_REF1 b;
    		int 	c;
    } //非法
    

    这个方法是非法的,成员b是另一个完整的结构体,其内部还将包含它自己的成员b.
    第二个成员又是另外一个完整的结构体,它还包含自己的成员b。这样永无止境循环。

    struct SELP_REF1{
    		int 	a;
    		struct SELP_REF1 *b;
    		int 	c;
    }//合法
    

    区别在于b现在是一个指针不是一个结构体,编译器在结构的长度确定之前就知道指针的长度,所以这种类型的自引用是合法的。

    如果你觉得一个结构内部包含一个指向该结构体本身的指针有些奇怪,请记住它事实上指向的是同一种类型的不同结构体。更加高级的数据结构,如链表和树,都是使用这种技巧实现的每个结构指向链表的下一个元素或树的下一个分支。

    警告

    typedef struct {
    		int 	a;
    		SELP_REF3	*b;
    		int 	c;
    }SELP_REF3;
    

    这个声明的目的是为这个结构体创建类型名 SELP_REF3。但是,它失败了
    类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义。

    解决方案是定义一个结构体标签来声明b,

    typedef struct SELP_REF3_TAG {
    		int 	a;
    		struct SELP_REF3_TAG *b;
    		int		c;
    }SELP_REF3;
    

    联合体的初始化

    联合体可以被初始化,但这个初始化必须是第一个成员的类型,而且它必须位于一个花括号内

    union {
    	int		a;
    	char   	b;
    	float 	c[5];
    }x = {5};
    
    把 x.a 初始化为5

    我们不能把这个初始化的类量初始化为 字符型,浮点型,只能是第一个成员的类型。如果被初始化为其他类型,则进行强制转换(如果可以转换),再赋值给x.a。

    本文参考《C和指针》这个本书写的。

    展开全文
  • 既然提到了struct那么肯定就避免不了结构体结构体的内存对齐。 1. 什么是结构体结构体是一系列类型数据的集合这些数据可能描述了一个物体。 2. 什么时候会用到结构体? 1. 当内置类型无法满足用户需求的时候,...

    struct
    struct可以将一些相关联的数据打包成一个整体。既然提到了struct那么肯定就避免不了结构体,结构体的内存对齐。 
    1. 什么是结构体? 
    结构体是一系列类型数据的集合这些数据可能描述了一个物体。 
    2. 什么时候会用到结构体? 
    1. 当内置类型无法满足用户需求的时候,没有合适类型的时候,需要封装特定的类型 
    2. 当函数有多个参数时,或者函数的返回值过多的时候,需要封装特定的类型,将参数打包返回 
    3. 什么是结构体内存对齐?为什么存在内存对齐?内存对齐的规则是什么? 
    编译器为程序中的每一个数据单元安排在合适的位置上,从而导致了相同的变量,同声明顺序的结构体的大小不同。 内存对齐存在的主要原因: 
    1. 平台原因:不是所有的硬件平台都可以访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出异常(这个为什么会抛出异常,不是很懂) 
    2. 性能原因:经过内存对齐后,CPU的内存访问速度大大提升,因为如果没有内存对齐的话,CPU在访问一个数据时可能会进行多次访问然后拼接在一起。 
    结构体的内存对齐规则: (看下面的规则)
    1. 结构体的第一个成员存放在与结构体变量偏移量为0的地址处 
    2. 结构体的其他成员要对齐到对齐数的整数倍地址处。对齐数:编译器默认的一个对齐数与该成员大小中的较小值,VS默认的对齐数位8Linux中默认值为4 
    3. 结构体的总大小最最大对齐数的整数倍 
    4. 如果一个结构体中嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍 
    5. 可以通过#pragma pack number设置对齐数 
    如何知道结构体中某个成员相对于结构体起始位置的偏移量?

    //使用offsetof宏  
     size_t offsetof( structName, memberName )
    --------------------- 

    规则一.: 每个成员变量在其结构体内的偏移量都是成员变量类型的大小的倍数。

    规则二: 如果有嵌套结构体,那么内嵌结构体的第一个成员变量在外结构体中的偏移量,是内嵌结构体中那个数据类型大小最大的成员变量的倍数。

    规则三: 整个结构体的大小要是这个结构体内数据类型大小最大的成员变量的倍数。如果有内嵌结构体,那么取内嵌结构体中数据类型大小最大的成员变量作为计算外结构体整体大小的依据。

    例子

    复制代码

    typedef struct TEST{
        int na;
        char cb;
        char cc;
        int nd;
        char cf;
        struct TT{
            int ng;
            long long llh;
        }tt;
        char ci;
    }test;
    

    复制代码

     

                            图一

      如上图所示,根据规则一,nd在结构体内的位置必须满足是其自身数据类型大小的整数倍,且倍数要取满足条件的最小倍数。因为nd前三个成员变量总大小是6Bytes,nd作为int类型,其数据类型大小是4Bytes,满足条件的最小倍数是2,所以nd在结构体中的偏移量是8,故填充2Bytes。

      根据规则二,ng作为内嵌结构体的第一个成员变量,它在外结构体中的偏移量要满足——其内嵌结构体中最大数据类型大小的倍数。在计算cf偏移量后,当前偏移量是13,而内嵌结构体中最大数据类型为long long,其大小为8,ng的偏移量必须是8的倍数,且取大于13的最小倍数,即2。所以ng前要填充3Bytes。

      根据规则三,计算完ci后,当前偏移量是33。如果要满足test结构体的大小是其中最大数据成员类型大小的倍数,在此例中是内嵌结构体的成员变量llh,即8的倍数。所以要填充7Bytes。

    展开全文
  • 本文主要介绍在struct 结构体中对数组和指针的操作细节。
  • struct和typedef struct 结构体定义区别

    千次阅读 2019-05-03 10:59:34
    1.结构体的定义: 允许用户自己建立由不同类型数据组成的组合型的数据结构...2.下面以一个结构体实例来说明一下struct的用法: structos_tcb { OS_STK*OSTCBStkPtr; OS_STK*OSTCBStkBottom; INT32UOSTCBStkSi...

    1.结构体的定义:

       允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(实际上应称为 结构体类型)。

     

    2.下面以一个结构体实例来说明一下struct的用法:

    struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    };

    Sturct       是声明结构体类型时所必须使用的关键字,不能省略。

    os_tcb      是结构体名

    花括号内   是该结构体所包括的子项,称为结构体成员。

     

    前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

    可以采取以下3中方式定义结构体类型变量。

    (1)先声明结构体类型,再定义该类型的变量

    定义上面的结构体类型后

    struct os_tcb    OS_TCB;    // 在定义了结构体变量后,系统会为之

             |                       |            // 分配内存单元

    结构体类型名      结构体变量名  

         

    (2)在声明类型的同时定义变量

    struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    } OS_TCB;     // OS_TCB 是一个结构体变量

     

    (3)不指定类型名而直接定义结构体类型变量

    struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    } OS_TCB;     // OS_TCB 是一个结构体变量

     

    指定了一个无结构体名的结构体类型,显然不能再以此结构体类型去定义其他变量。

     

    注:结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取后运算。在编译时,对类型不分配空间,只对变量分配空间。

     

     

    3.下面再以此结构体实例来说明一下typedef struct的用法:

    (主要参考技术博客:http://dzdesigned80.blog.163.com/blog/static/203259238201245105525341/)

    阅读程序发现两种用 typedef struct 定义结构体的方法

    第一种:

    typedef struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;

    第二种:

    typedef struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;

     

    可以看出,上面的区别在于 typedef struct 后面一个跟了标识符,另外一个没有跟标识符,这两个有什么区别呢?这里的os_tcb代表什么?OS_TCB的意义又是什么?

     

    要搞清楚上面的问题,要从两方面入手。

    第一 typedef的用法是什么?

    typedef是在基本类型的基础上定义类型的同义字。注意typedef并不产生新的类型。例如 typedef int exam_score;这里的exam_score 就是一种基本类型,它的意义等同于 int,那么机可以用它来定义变量,exam_score LIMING。

    第二 结构体的定义各个标志符的意义。

    在结构体定义中,通常是这样的

    struct exam_score

    {

    chinese;

    english;

    math;

    physical;

    chemistry;

    }LIMING;

    这里的struct是结构体关键字,exam_score则是结构体类型名,LIMING则是结构体变量。

    弄明白以上两个问题,回过头来看开始的那两个结构体。

    typedef struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB; // OS_TCB是一个结构体类型 = struct os_tcb

    这里声明一种结构体类型os_tcb,所以os_tcb就是结构体类型名;OS_TCB是struct os_tcb 的同义字,所以可以直接用OS_TCB来定义变量,同时也可以这样 struct os_tcb xxx,OS_TCB xxx;都是合法的,因为OS_TCB就等同于      

    struct os_tcb。

     

    来看第二种

    typedef struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;    // OS_TCB是一个结构体类型 = struct 

    在结构体的定义中允许这样形式的定义:

    struct

    {

    xxx

    xxx

    xxx

    }var;

    这里没有声明结构体变量名,直接定义了结构体变量var,var在这里是结构体变量。这样定义的结果是在程序不能再定义新的结构体变量。

    这种形式加上typedef 之后情况就变了,这里的OS_TCB不是结构体变量,而是struct的同义字(结构体类型),这个同义仅限于上面定义的那种情况,可以用OS_TCB来定义结构体变量。

     

    总结:

    有了以上叙述与理解,我们便可以很容易搞清楚一个易混淆的点:struct{}后面的到底是结构体变量名,还是结构体类型名。

     

    当只是定义结构体类型:

    struct 结构体名

    {

            结构体成员名

     

    }结构体变量名;

    引用结构体成员方式应是:

    结构体变量名. 结构体成员名  //结构体变量直接引用结构体成员

     

    当使用typedef定义时:

    typedef struct 结构体名

    {

            结构体成员名

     

    }结构体类型名;

    引用结构体成员方式应是:

    结构体类型名 xxx;// 定义一个结构体变量

    xxx.结构体成员名  // 引用结构体成员
    --------------------- 
    作者:SudekiMing 
    来源:CSDN 
    原文:https://blog.csdn.net/WalterBrien/article/details/79624405 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • C++中同样拥有C语言中的结构体,下面就来详解C++程序中定义struct结构体的方法,需要的朋友可以参考下
  • 浅析task_struct结构体

    千次阅读 2018-09-27 19:52:00
    task_struct结构体是Linux下的进程控制块PCB,PCB里包含着一个进程的所有信息。 要了解task_struct结构体,就必须要知道什么是进程。进程可以有以下几个定义: 一个正在执行的程序。 一个正在计算机上执行...
  • python struct 结构体

    万次阅读 多人点赞 2018-07-12 20:44:57
    import struct 有的时候需要用python处理二...可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字...
  • C语言-struct 结构体变量的内存分配

    千次阅读 2019-09-24 22:55:00
    struct内存分配 定义技巧 首先我们定义struct变量,笔者习惯定义时,直接输入: struct name { }; 再对struct内部成员进行定义,防止“;”遗漏,导致程序报错。 先看一段代码 #include<stdio.h> ...
  • struct结构体语法总结

    千次阅读 2018-04-17 16:31:28
    结构体简介结构体属于聚合数据类型的一类,它将不同的数据类型整合在一起构成一个新的类型,相当于数据库中一条记录,比如学生结构体,整合了学号,姓名等等信息。...C语言结构体语法第一种语法表示struct 结构体...
  • C++学习笔记:struct结构体1.结构体概述2.结构体的定义和使用3.从数组到结构体的进步之处4.结构体变量中的元素访问 1.结构体概述 C++语言中的2种类型:原生类型(如int、char等)和自定义类型(如class,struct,...
  • 我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。...结构体(stru
  • 在c语言中,定义一个结构体类型最好用上typedef这种方式,至于为什么?下面我们简单讲下。typedef struct point{int x;int y;}Point;在声明变量或定义变量的时候就可以像这样:Point p1;如果没有用typedef这个关键字...
  • struct结构体数据类型

    千次阅读 2020-02-07 14:04:22
    前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(c99) 等等数据类型,他们可以表示一些事物的基本属性,但是当我们...这种数据类型叫结构体,英文名称struct,可以使用struct...
  • struct 结构体名 { int a; int b; char x; }; //需要分号 struct 结构体名 变量名; //使用方式二 声明与定义同时进行 struct 结构体名 { int a; int b; }变量名; //使用方式三 直接进行定义 struct { int a; ...
  • struct 结构体 所占字节数的计算

    千次阅读 2019-10-10 19:29:39
    定义结构体类型,只能说明该类型的组成情况,并没有分配内存空间。只有当定义属于结构体类型的变量时,系统才会分配空间给该变量。
  • 结构体 结构体一般形式: 定义一个结构体结构体初试化的一般方法: 结构体数组: 结构体数组初始化与赋值 结构体构造函数 第一种构造函数形式 第二种构造函数形式 结构体 结构体一般形式: struct ...
  • C++之struct结构体使用详解

    万次阅读 2017-02-13 13:14:37
    但是假如我们要存储一个人的信息,包含姓名、身高、体重等信息,仅使用一种基本数据类型是无法实现的,因此我们希望有一种数据格式能够将所有这些信息存储在一个单元中,这就需要使用struct结构体完成。 一、...
  • 1.结构体a中,有4个字段,如下图所示: 例:提取其中一个字段,若提取data,可执行以下代码: 这样把a中data字段的所有数据赋给[X]。 [X] = {a(:).data}; [Y] = {a(:).arousal_labels}; 这里X也是一个结构体: 2....
  • struct结构体占内存字节数

    千次阅读 2020-03-20 10:01:18
    昨天写了一个结构体demo,心血来潮打印struct所占内存字节数 struct student{ char name[20]; char sex; int num; float score[3]; void print(); }; 你猜猜是多少个字节数呢(对于char[]这样的赋值,先暂且...
  • 定义struct结构体数组

    千次阅读 2020-03-24 22:00:23
    设一个结构体数组,数组中包含3个元素 每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型) 输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1 输出...
  • 1.3 struct 结构体 结构体与函数

    千次阅读 2014-12-16 14:45:23
    结构体作为函数的变元 struct family { char name[20]; int age; char father[20]; char motger[20]; }; //比较两个家庭的妈妈 是否相同。 是返回0 否则返回非0 int siblings(struct family member1, struct ...
  • 该文件详细介绍了用sizeof求取struct结构体内存大小的各种情况
  • typedef struct结构体总结篇

    千次阅读 2018-07-12 10:09:31
    //1、用typedef struct student{类型 变量名}STU,*STU1,在{}后面跟的STU是该结构体的变量名,*STU1是该结构体的类型的地址。 typedef struct student{ int age ; }STU ,*STUP; /* 上面的和下面的等价 typedef...
  • struct vm_area_struct结构体学习

    千次阅读 2018-11-09 20:35:52
    Linux通过类型为vm_area_struct结构体对象实现线性区,该结构定义了内存VMM内存区域。 每个VM区域/任务中有一个。 VM区域是进程虚拟内存空间的任何部分,它具有页面错误处理程序的特殊规则(即共享库,可执行区域...
  • @https://blog.csdn.net/longtian635241/article/details/7720989TOC
  • 在c/c++中内存对齐是个经常遇到的问题,现在的CPU一次读取64...c#同样的结构体也是8byte对齐。 using System; struct ss { public int a; // 4字节 // public int aa; // 4字节 public Int64 aaa; public In...
  • 针对内存连续的结构体,把一整段内存拷贝到char数组对应的内存中。考虑4字节对齐! struct Test { int a; char b; char c[1024]; unsigned short d; }; char *ch = "abcdefghijklmn1234567890"; char *chTest ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 429,325
精华内容 171,730
关键字:

struct结构体