结构体/联合体 所占用内存
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 }
执行结果为:
定义了一个结构体,一个联合体。
结构体:把不同类型的数据组合成一个整体——自定义数据类型
联合体:使几个不同类型的变量共占一段内存(相互覆盖)
因此,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次即可