结构体/联合体 所占用内存

Posted 天道酬勤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体/联合体 所占用内存相关的知识,希望对你有一定的参考价值。

 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次即可

以上是关于结构体/联合体 所占用内存的主要内容,如果未能解决你的问题,请参考以下文章

结构体struct和联合体union(联合)有啥区别呢?

结构体大小计算以及sizeof与strlen的区别

C语言 共用体/联合体 union

结构体大小计算以及sizeof与strlen的区别

结构体和联合体

C 联合体