结构体/联合体 所占用内存
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次即可
相关文章推荐
- thinkphp集成系列之阿里云oss
- 第三方支付原理与概述
- 傅里叶变换
- 小白分享学习成果,大神勿喷。用bootstrap做的,引用就不再多说了,哪里写的不好,您多指点
- thinkphp集成系列之阿里云oss
- 《深入理解Android内核设计思想》学习笔记
- 8个类,1500行代码搞定插件化
- Android基础之打造自己的魔法万能适配器
- 实现基于Android的英文电子词典
- 团队项目第二周
- ssh-批量管理 优化 免秘钥
- HDU 5696 区间的价值
- LightOJ 1138 Trailing Zeroes (III)(二分)
- Learning OpenCV : read and display a picture
- Android键盘处理-监听键盘状态并实现QQ拉出式弹出回复框。
- byte数组转int类型,不足位数补0问题的解决
- Spring控制反制IOC
- UI基础第三天(知识点)
- LeetCode No336. Palindrome Pairs
- Git 常用命令使用