精华内容
下载资源
问答
  • 结构体动态内存分配定义 可以用别名不用别名

    结构体动态内存分配定义
    可以用别名在这里插入图片描述不用别名在这里插入图片描述

    展开全文
  • C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?


    问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的。


    问题2:给结构体变量分配之后,是否还要给每个成员分配,还是只给不能确定大小的成员分配?


    问题3:如果是要每个成员分配内存,那么释放的时候是不是每个成员都要单独释放?指针加一之后,又怎么做?



    C\C++中结构体变量与结构体指针内存分配问题?


    (1)声明一个结构体变量,无论是否初始化,都开辟内存,声明一个结构体指针变量,对其初始化的时候才会开辟内存。


    (2)结构体变量分配结构体本身大小的空间,结构体指针分配4个字节,其实任何类型的指针都是分配四个字节的指针空间。


    (3)所以:
         A a[3]; //a里面是三个A变量,所以分配三个结构体大小
         A *a;  //a是一个指针,分配4个字节,就算A再大,a也只是4个字节,因为任何类型的指针都是4个字节。要使用a,必须先要对指针初始化,也即分配空间了。
         如:
         A *a;
         a = (A*)malloc(sizeof(A));


    (4)我们完全可以撇开结构体,把问题简单化成int类型来说明这个指针问题:
    int a1[10];
    int *a2;


    1)a1是包含10个int的数组,大小也就是10*sizeof(int)。直接使用a1不要在进行什么初始化或者分配空间的游戏,因为数组a1里面本身存放的就是int变量本身了。


    2)a2是一个int*的东西,也就是整型指针,a2不能存放int变量,它只能存放一个int变量的地址。如果要使用a2,必须首先对a2初始化,即将它指向一个int变量的地址,如:a2 = (int*)malloc(sizeof(int));
    或者
    int i = 10;
    a2 = &i;
    所以,malloc函数的作用是首先声明一个变量,然后返回该变量的地址。
    所以:a2 = (int*)malloc(sizeof(int)) 的含义就是把该变量的地址赋值给a2,和a = &i 本质上并没有什么不同,只是一个变量是栈上,一个是堆上,都是一个地址赋值。


    (5)所以,所谓的分配空间,就是对指针赋值,把一个变量的地址赋值给一个指针。
    展开全文
  • 结构体变量内存分配问题

    千次阅读 2019-03-09 08:44:44
    1.为结构体变量的成员变量分配内存的起始地址必须为成员变量内存长度的整数倍。 2.结构体变量内存的总大小必须为sizeof(结构体成员变量)(最大的)的整数倍。 struct Demo{ char a;//sizeof(char)=1 int b;//...
    遵守两个原则

    1.为结构体变量的成员变量分配内存的起始地址必须为成员变量内存长度的整数倍。
    2.结构体变量内存的总大小必须为sizeof(结构体成员变量)(最大的)的整数倍。

    struct Demo{
    	char a;//sizeof(char)=1
    	int b;//sizeof(int)=4
    	flloat c;//sizeof(float)=4
    	double d;//sizeof(double)=8
    };
    struct Demo demo;
    sizeof(demo)=24;
    
    1. 假设从0开始为结构体变量分配内存
    2. 0:分配给demo.a;
    3. 4-7:分配给demo.b,根据原则一,分配起始地址必须为成员变量内存长度的整数倍,1不是4的整数倍,所以从4开始分配;
    4. 8-11:分配给demo.c;
    5. 16-23:分配给deom.d,根据原则一分配起始地址必须为成员变量内存长度的整数倍,必须为8的整数倍,12不是8的整数倍,必须从16开始,同时满足原则二,成员变量占内存最长为8,24为8的整数倍,所以该结构体分配内存24;
    struct Demo{
    	char a[6];//sizeof(char)=1
    	double b;//sizeof(double)=8
    	int c;//sizeof(int)=4
    };
    struct Demo demo;
    sizeof(demo)=24
    
    1. 假设从0开始为结构体变量分配内存
    2. 0-5:分配给demo.a;
    3. 8-15:分配给demo.b(根据原则一);
    4. 16-19:分配给demo.c(根据原则一);
    5. 20-23:补全为8的倍数(根据原则二)。
    struct Demo{
    	char a[6];
    }demo;
    sizeof(demo)=6;
    
    struct Demo{
    	char a[6];
    	struct Demo *next;
    }demo;
    sizeof(demo)=16;(64位计算机)
    

    指针变量的功能是存储变量的地址,所以在定义执政变量的时候会为指针变量分配一定的内存(16位:2,,32位:4,64位:8),而且这个内存的大小与指向的变量的类型无关,并不是指向double类型就分配8,指向int类型为4,而是即使指向的char类型,分配的也是8(64位),因为指针变量里面存储的只是地址

    大家把上面几个例子分析清楚,应该对结构体内存分配了解的就差不多了,如有错误希望大家指正。
    展开全文
  • 首先分析一下含有基本数据类型成员的结构体内存分配: struct空间分配的原则: (1) 整体空间是占用空间最大的成员所占字节数的整数倍; (2)数据对齐原则:内容按成员先后顺序摆放,当排到该成员变量时,其前面...

     Date:2017/5/20

    Author: Soaringlee        


    首先分析一下含有基本数据类型成员的结构体的内存分配:

    struct空间分配的原则:

    (1) 整体空间是占用空间最大的成员所占字节数的整数倍;

    (2)数据对齐原则:内容按成员先后顺序摆放,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够,则补齐,依次向后类推。

    含有结构体的结构体的空间分配:

    (1) 整体空间是子结构体和父结构体中占用空间最大的成员所占字节数的整数倍;

    (2)数据对齐原则:内容按照成员先后顺序摆放,子结构体前面成员所占空间必须是子结构体中占用空间最大成员所占字节数的整数倍。

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

    2019-07-11 13:09:08
    首先来看一段代码: # include using namespace std ; struct man { double b ; // 8 char a ; // 1 int c ; // 4 } ; int ...以上就是结构体内存分配的原理了!
  • C语言结构体成员内存分配

    千次阅读 2017-04-02 17:26:10
    C语言中结构体内存分配曾经把我迷惑了好一阵子,确切说可以说是结构体对象所占用的空间判断让我迷惑了一阵子。把我之前探索的过程记录下来,做一下简单的学习总结。在此之前,我已经了解到了一点基本的信息,也就是...
  • iOS结构体内存分配问题

    千次阅读 2017-06-03 11:55:35
    结构体内存分配问题(转) 1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。 (2)终于搞懂struct结构体内存分配问题了,结构体中各个成员字节对齐遵循以下几个原则: 1.结构体...
  • 当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐;当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐
  • C语言好难——结构体内存分配

    千次阅读 2016-10-09 23:30:48
    结构体内存分配,我个人是觉得比较蛋疼的,它有一个需要遵循的原则,地址对齐,也有人称为内存对齐,叫法没关系,反正我只是“拿来”,会用就行。  好了,先有这么一个概念,什么是内存对齐,先丢一边。……~(~o...
  • //结构体内存分配原则 //以结构体成员中所规定的存储空间最大的空间为单位进行分配,是最大空间的最小整数倍 //struct + 结构体名字{大括号中填写结构体成员,多个结构体成员之间通过分号进行间隔 + ;(分号必不...
  • 以下是系统对结构体内存分配的详细介绍: 1、结构体变量的首地址是结构体中最宽数据类型的整数倍。     编译器在给结构体开辟空间时 , 首先找 到结构体中最宽的基本数据类 型, 然后寻找内存地址能是该...
  • C结构体内存分配

    2020-05-04 18:43:15
    转载:https://www.cnblogs.com/plxx/p/3382588.html
  • 声明一个结构体变量,无论是否初始化,都开辟内存,声明一个结构体指针变量,对其初始化的时候才会开辟内存。 A a[3]; a是A型的,有3个,当然分配A乘3大小的空间 A* a; a是A*型的,当然只分配A*大小的空间,而...
  • 转载自http://hi.baidu.com/tengfeitengfei/blog/item/64710a363cb0b3daa3cc2bfb.html<br /><br />去年和一个参加过笔试的同学一起学习了结构体内存分配方法,现在想一想又忘了,哎真是快啊,现在吧我查到的...
  • 结构体内存分配

    2009-09-14 16:56:00
    VC中结构体内存分配问题透析 在一次面试中,遇到了VC中处理结构体的问题,由于平时没留意,没有回答出来,感觉很不爽。回来后,认真分析了下,查了些资料,终于找到原因,故以本文给出解答。 本文首先提出了处理...
  • 转:结构体内存分配机制

    千次阅读 2018-06-12 11:43:11
    他和其他的数据类型是一样的,在定义一个结构体的时候,系统并不会为他真正的分配内存空间(定义的结构体变量要在编译的阶段才分配空间,而结构体指针要显示的使用malloca来分配空间),也就是说,在定义结构体这种...
  • 最近对C语言中的结构体分配问题做了一些功课,总结一下,有错误的地方欢迎大家指正。 大家都知道结构体中 char 偏移量必须为sizeof (char)即 1 的整数倍 int 偏移量必须为sizeof (int)即 4 的整数倍 ...
  • C/C++ 语言中结构体内存分配2007年10月29日 星期一 08:52 A.M. 引 C/C++ 语言中结构体内存分配 C/C++ 语言中结构体内存分配 当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度...
  • 数组在结构体内存分配问题

    千次阅读 2019-02-22 12:00:38
    数组及其他变量不在结构体中,在栈中 #include &lt;stdio.h&gt; int main() { int a=100; int b[2]; int c=200; int b[-1]=10; int b[2]=10; printf("%d %d",a,c); return 0; }     ...
  • 分析:(1)为x分配空间,其起始地址跟结构体的起始地址相同(偏移量为0,是sizeof(char)的倍数),该成员变量占用sizeof(char)=1个字节; (2)为y分配空间,此时对于结构体的起始偏移量为1,不是 sizeof(double)的...

空空如也

空空如也

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

结构体动态内存分配