zoukankan      html  css  js  c++  java
  • 结构体/联合体 所占用内存

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

  • 相关阅读:
    DailyRollingFileAppender的使用
    CSS自动换行
    MAC与WIN10电脑共享文件
    C++常用STL
    Python机器学习及实践 课后小题
    Mac上利用VScode配置c/c++开发环境
    pycharm+anaconda在Mac上的配置方法 2019.11.29
    二分查找 python实现
    python3相关
    算法图解 各部分回忆
  • 原文地址:https://www.cnblogs.com/may1016/p/5518204.html
Copyright © 2011-2022 走看看