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

翻译 2017年07月15日 14:24:33
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)所以,所谓的分配空间,就是对指针赋值,把一个变量的地址赋值给一个指针。

相关文章推荐

【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明

【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明标签:【VS开发】 【编程开发】 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性。...

Delphi 的内存操作函数(3): 给结构体指针分配内存

使用结构或结构数组, 一般是不需要主动分配内存的, 譬如: var   pts: TPoint; begin   pts.X := 1;   pts.Y := 2;   ShowMes...

C语言好难——结构体的内存分配

结构体的内存分配,我个人是觉得比较蛋疼的,它有一个需要遵循的原则,地址对齐,也有人称为内存对齐,叫法没关系,反正我只是“拿来”,会用就行。        好了,先有这么一个概念,什么是内存对齐,先丢一...

c++公用体union、结构体struct内存分配问题

#include #include #include using namespace std; union data { char c1; //字符型占1字节 int n; ...

C语言,内存对齐,内存分配,地址操作,结构体(二)

上次在操作结构体地址的时候,本来想

C 结构体 内存分配

1)相同的成员,不同的排序 即为:结构中的元素布局和排序 2)结构体实际占用字节(max、min) 3)元素实际存放位置 4)是否含有静态成员 结构体内存计算方式:计算结构体大小时需要考虑其内存布...

关于结构体的内存分配问题--sizeof(/*struct*/A)

问题描述:C、C++中的结构体 struct A{变量列表}; 是定义类的一种方式,与class 关键字类似,同样可以定义继承方式为public、private、protected三种方式,但是不同的...

iOS结构体的内存分配问题

结构体内存分配问题(转) 1)sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。 (2)终于搞懂struct结构体内存分配问题了,结构体中各个成员字节对齐遵循以下...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)