精华内容
下载资源
问答
  • 结构体内存分配

    2012-07-19 17:05:04
    结构体内存分配不一定是连续的: struct A{  int a;  char b;  short c; }; struct B{  char b;  int a;  short c; }; 其中一次以上两个结构体各个成员分配的地址如下: A.a:0xbf86c148 A.b:0...
    结构体内存分配不一定是连续的: 
    

    struct A{

           int a;

           char b;

           short c;

    };

    struct B{

           char b;

           int a;

           short c;

    };

    其中一次以上两个结构体各个成员分配的地址如下:

    A.a:0xbf86c148

    A.b:0xbf86c14c

    A.c:0xbf86c14e

    B.a:0xbf86c140

    B.b:0xbf86c13c

    B.c:0xbf86c144

    (CSDN第一滴记录...)

    展开全文
  • C - 结构体内存分配

    千次阅读 多人点赞 2018-11-07 14:41:39
    ,经过学习,特把有关结构体内存分配的相关知识记录下来。 内存对齐:要了解结构体的内存分配,首先需要了解内存对齐的概念。之所以会有内存对齐的概念,是因为,在操作系统中,数据的存放时按照字节存放的,而...

    最近又捡起了C语言,遇到了大量对结构体操作的业务,在操作期间,发现对结构体在内存中的分配仍然存有一定的疑问。,经过学习,特把有关结构体内存分配的相关知识记录下来。

    内存对齐:要了解结构体的内存分配,首先需要了解内存对齐的概念。之所以会有内存对齐的概念,是因为,在操作系统中,数据的存放时按照字节存放的,而结构体又不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定偏移量来存储,根据类型的不同,每个成员都要按照一定的对齐数进行对齐存储,最后整个结构体的大小也要按照一定的对齐数进行对齐。关于具体的概念以及为什么要采用内存对齐的方式可以参考博文:https://blog.csdn.net/Misszhoudandan/article/details/81570548

    下面就结合具体的例子来描述结构体的内存空间是怎么分配的:

    1、请看下面的结构体:

    struct MsgTest
    {
    	char a;
    	int b;
    };

    MsgTest占多少个字节呢?刚开始我以为是5字节(char 1字节+int 4字节),但实际上是8字节,请看下图:

    由上图可以看出,char类型的元素a的起始地址为0x43fd50,而int型元素b的起始地址为0x43fd54,也就是说,系统为元素a总共分配了4个字节的内存(虽然a本身只占用了一个字节长度的内存),剩下的3字节长度的内存就是基于内存对齐的概念进行填充的,不计入操作。

    2、接下来看如下的结构体:

    struct MsgTest
    {
    	char a;
    	char b;
    	int c;
    };

    按照上节讲述的原则,那这个结构体所占的内存应该是12字节,但实际上他占了多少个字节呢?请看下图:

    这个结构体也是占了8字节。为什么会这样呢,那是因为基于内存对齐的概念,每一个元素应该是按照4字节的标准进行补齐,但是元素a和元素b各占1字节,所以还剩下2字节需要补齐,右上图也可以看出,元素a和元素b的内存只相差了一个字节。实际上,在该结构体中即使是如下样式:

    struct MsgTest
    {
        char a;
        char b;
        char c;
        char d;
        int e;
    };

    它所占的内存仍然是8个字节:

    3、下面是一些其他格式的结构体:

    1):

    2):

    在该结构体中,a占了4字节,b占了40字节(16进制为28),c占了4字节,d占了8字节,e占了8字节。

    3):

    可以看一下如下的题目,各位可以先算一下占多少个字节:

    需要注意的是,对char*类型的元素,在内存中存放的其实是它的地址(占4字节),_int64类型的占8字节,unsigned其实是unsigned int的简写,也占了4字节。

    参看答案如下所示:

     

     

     

     

     

     

    展开全文
  • 结构体内存分配问题

    2019-06-30 17:19:09
    结构体内存分配问题 【A】struct student { int num; char name; double mark; } 【B】struct student { int num; double mark; char name; } 也许大家一看这A,B两个结构体不是一样的么想想这个结构体占的字节数?...

    结构体内存分配问题

    【A】struct student
    {
    int num;
    char name;
    double mark;

    }
    【B】struct student
    {
    int num;
    double mark;
    char name;
    }
    也许大家一看这A,B两个结构体不是一样的么想想这个结构体占的字节数?“也许”大家都会以为 A和B结构体所占的字节数都是:sizeof(struct student)=sizeof(char)+sizeof(int)+sizeof(double)=1+4+8=13 个字节,貌似看起来没有问题,但是实际上呢!!!
    所占字节数: 【A】: 16个字节 【B】: 24个字节
    怎么会这样!!!
    规则:
    结构体成员对齐规则:
    在这里插入图片描述
    结构体整体对齐规则:
    在这里插入图片描述
    【为什么会这样】:为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
    即:
    char 偏移量必须为sizeof( char )即1的倍数
    int 偏移量必须为sizeof( int )即4的倍数
    double 偏移量必须为sizeof(double)即8的倍数
    float 偏移量必须为sizeof( float)即4的倍数

    各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充,填充部分没有放任何有意义的东西,结构体的总字节大小必须是该结构中占用最大空间的类型所占用的字节数的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

    先看结构体【A】:int num//偏移量为0,满足对齐方式,num占用4个字节;char name //因为前面的num占用4个字节,这时分配的地址对于结构的起始地址的偏移量为4,是sizeof(char)=1的4倍,满足对齐方式,所以char 占用sizeof(char)=1个字节数目,此时给下一个可以分配的地址对于结构体起始地址的偏移量为4+1=5,此时不是下一个sizeof(double)=8的倍数所以不满足对齐方式,所以VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为8,刚好是sizeof(double)=8的倍数,所以把存放 mark 在偏移量为8的地方,该成员变量占用sizeof(double)=8个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:4+1+3+8=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(struct student)=4+1+3+8=16!********同理可得结构体【B】所占内存的字节数是 24。

    当然对齐系数可以修改:
    在这里插入图片描述

    展开全文
  • 结构体内存分配机制 我们定义一个Person结构体(包括名字,年龄) 我们看看下面一段代码,输出什么内容? var p1 Person p1.Name = "小明" var p2 Person = p1 fmt.Printin(p2.Age) p2.Name = "tom" fmt.Printf...

    结构体内存分配机制

    • 我们定义一个Person结构体(包括名字,年龄)
    • 我们看看下面一段代码,输出什么内容?
    var p1 Person
    p1.Name = "小明"
    var p2 Person = p1
    fmt.Printin(p2.Age)
    
    p2.Name = "tom"
    fmt.Printf("p2.Name=%v p1.Name=%v",p2.Name,p1.Name)
    
    • 输出的结果是: p2.Name = tom p1.Name = 小明

    • 结构体在内存中示意图


    • 看下面代码,并分析原因
    type Person struct {
    	Name string
    	Age  int
    }
    
    func main() {
    
    	var p1 Person
    	p1.Age = 10
    	p1.Name = "小明"
    	var p2 *Person = &p1  
    
    	fmt.Println((*p2).Age)
    	fmt.Println(p2.Age)
    	p2.Name = "tom~"
    	fmt.Printf("p2.Name=%v p1.Name=%v \n", p2.Name, p1.Name)    
    	fmt.Printf("p2.Name=%v p1.Name=%v \n", (*p2).Name, p1.Name) 
    
    	fmt.Printf("p1的地址%p\n", &p1)
    	fmt.Printf("p2的地址%p p2的值%p\n", &p2, p2)
    }
    • 输出结果:

    • 内存示意图:

    展开全文
  • C 结构体 内存分配

    2016-03-13 14:39:50
    1)相同的成员,不同的排序 即为:结构中的元素布局和排序 2)结构体实际占用字节(max、min) 3)元素实际存放位置 ...结构体内存分配的原则:编译器按照成员列表顺序一个接一个地给每个成员分配内存。只有当存储成员
  • c结构体内存分配原则

    2019-03-14 13:30:38
    结构体内存分配原则 原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会...
  • C语言中结构体内存分配机制

    千次阅读 2015-07-10 10:42:38
    C语言中结构体内存分配机制 内存分配遵循的原理: (1) :分配的内存空间的大小必须是4的倍数 (2):在结构体中每一个类型类型说明符(char,int,float,double,long)分配的内存空间的大小与类型说明符最大的字节保持...
  • 关于结构体内存分配机制的详解。 直接上例子。 typedef struct strdent1 { int a; //4字节 char b; //1字节 char c[3]; //3字节 }std1; //4+1+3=8 typedef struct strdent2 { char a[3]; /...
  • C/C++结构体内存分配问题详解
  • C#new出来的结构体内存分配在堆上

    千次阅读 2018-09-11 22:46:00
    C#new出来的结构体内存分配在堆上 如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的。我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理。 new int[10]这个说明不...
  • C语言结构体内存分配问题

    千次阅读 2018-08-22 21:17:40
    1.内存对齐 1.结构体大小必须是结构体占用最大字节数成员的整数倍,这样在处理数组时可以保证每一项都边界对齐 2.结构体的每一个成员起始地址必须是自身类型大小的整数倍 3.字节对齐取决于编译器,Keil默认4...
  • 结构体内存分配问题(转)

    千次阅读 2012-03-13 11:33:21
    结构体内存分配问题(转) 1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。 (2)终于搞懂struct结构体内存分配问题了,结构体中各个成员字节对齐遵循以下几个原则: 1....
  • 结构体内存分配总结

    2013-06-23 22:31:25
    结构体内存 的对齐:每个成员分配内存的时候都要放在自己的整数倍的位置上。超过四个字节的都按照4的整数倍对齐。数组类型的成员分配内存是由数组元素的类型来决定。对齐的好处:便于成员的寻址。坏处:有内存的浪费...
  • =========20190713 update================ ...结构体信息如下 struct picInfo{ std::string path; unsigned int width; unsigned int height; unsigned int extra; }; struct areaPos{ ...
  • c 函数传递参数 & 结构体内存分配

    千次阅读 2012-02-19 11:28:55
    1. 结构体内存分配  结构体中的各个字段在内存中的出现的位置时随它们被声明的 顺序而依次递增的。并且第一个字段的首地址等于整个结构体实例的首地址。  说明 : 结构体类型是一个类型,就好比 int 是一个...
  • 1.基本数据类型只能满足一些基本的要求,只能表示具有单一特性...这时就需要运用结构体结构体类型的一般形式为(不叫定义,原因在后面): struct结构体名 { 成员列表 }; struct结构体名 { int a; char b[1...
  • 定义结构体类型,系统不为之分配内存单元。 当使用结构体类型定义变量时,才开辟内存单元。 结构体内存中所占的大小决定于两点: 1.编译器默认或指定对齐数;(eg:64为ubuntu14.04 默认8) 这个可通过 ‘#...
  • 实验使用sizeof关键字测量结构体大小的规则 查资料得到的规则如下 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该...
  • C语言中结构体内存分配问题解析。

    千次阅读 2015-03-25 10:40:22
    分析了编译器对结构体内存空间的分配
  • #include <stdio.h> int main() { /*************************************************** ... * 结构体内存分析(注意结构体里面定义成员结束后要使用分号): * struct Date * { * int y...
  • 在class中的结构体内存在堆上,因为class是引用类型。 函数中直接new出的单一结构体对象,内存在栈上。 new出的结构体数组,内存在栈上,因为数组是引用类型。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,634
精华内容 49,853
关键字:

结构体的内存分配