您的位置:首页 > 其它

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

2016-05-22 22:47 796 查看
#include "stdafx.h"
#include <iostream>
using namespace std;

typedef struct Parameter{
int a;
long b;
double c;
int d;
}Parameter;

typedef union Para{
unsigned a;
double b;
long c;
int d;
}Para;

Parameter rp[2] = {{0,},};

int main()
{
int n,*ip;
rp[1].d=5;
cout<<sizeof(Parameter)<<endl;
cout<<sizeof(Para)<<endl;
for(n=0,ip=(int*)rp;n<11;n++)
*ip++=0;
cout<<rp[1].d<<endl;

system("pause");
return 0;
}


执行结果为:



定义了一个结构体,一个联合体。

结构体:把不同类型的数据组合成一个整体——自定义数据类型

联合体:使几个不同类型的变量共占一段内存(相互覆盖)

因此,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次即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: