结构体/联合体 所占用内存
1 #include "stdafx.h"
2 #include <iostream>
3 using namespace std;
4
5 typedef struct Parameter{
6 int a;
7 long b;
8 double c;
9 int d;
10 }Parameter;
11
12 typedef union Para{
13 unsigned a;
14 double b;
15 long c;
16 int d;
17 }Para;
18
19 Parameter rp[2] = {
{
0,},};
20
21 int main()
22 {
23 int n,*ip;
24 rp[1].d=5;
25 cout<<sizeof(Parameter)<<endl;
26 cout<<sizeof(Para)<<endl;
27 for(n=0,ip=(int*)rp;n<11;n++)
28 *ip++=0;
29 cout<<rp[1].d<<endl;
30
31 system("pause");
32 return 0;
33 } 1 #include "stdafx.h" 2 #include
执行结果为:
定义了一个结构体,一个联合体。
结构体:把不同类型的数据组合成一个整体——自定义数据类型
联合体:使几个不同类型的变量共占一段内存(相互覆盖)
因此,sizeof(Parameter)=24
int/long类型数据在系统中占4个字节,double类型数据占8字节
因此,Parameter结构体在内存中的形式为:
每一个小方框代表4个字节,因此sizeof(Parameter)=6*4=24
如之前所说,联合体是使几个不同类型的变量共占一段内存,因此找出占用内存最大的成员double c,所以,sizeof(Para)=8
前面定义了结构体数组rp[2]
main函数中有这么一个for循环,for(n=0,ip=(int*)rp;n<11;n++) *ip++=0;
首先,指针ip指向结构体数组rp的首地址,而使用(int*)修饰的原因是强制类型转换,因为结构体数组中存在double类型的成员。
循环11次,每循环一次,指针后移一个int的长度,因此,for循环结束后,自rp[2]的首地址开始的11*4=44字节的内存空间中的数据全部清零。
这里,有一点值得注意,之前我们得到过sizeof(Parameter)=6*4=24,乍一看,数组rp[2]应占用48字节的内存空间,而我们这里只循环11次,只清零了11次(44字节),就使得rp[1].d=0了,实际上结构体数据在内存中的排列方式为:
从图中可以一目了然了,只需要循环11次即可
1 #include "stdafx.h" 2 #include