结构体&位域&共用体占用内存解释

1、结构体内存大小计算原则: 就是结构体大小结果要为成员中最大字节的整数倍。

先看下面定义的两个结构体:

struct {   char a;   short b;   char c; }S1;

struct {  char  a;  char  b;  short c; }S2;

分别用程序测试得出 sizeof(S1)=6 , sizeof(S2)=4

注意: 为什么 仅仅改变了结构体成员的顺序,结果不一样?

解:

  • (1)首先找出成员变量中最大的字节,可见对于 S1 和 S2 最大是 short ,占 2 个字节;
  • (2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节;
  • (3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

对于 S1 来说,顺序是 char->short->char :

所以对于 S1 结构体大小为 2*3=6,至于为什么第二个 char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍。

S1=2*3=6

对于 S2 嘛,也画个图,但是顺序是 char->char->short:

S2=2*2=4

按照这个方法再看这样的一个结构体:

struct stu1
{
    int i;
    char c;
    int j;
};

很明显,最大字节为 4 个。顺序 int char int:

因为 int 占 4 个,而 char 已经占了一个,不够,所以那三个只能多余占位。

Stu1=3*4=12

那么换一下呢?

struct stu2
{
    int i;
    int j;
    char  c;
};
Stu2=3*4=12

再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行。

typedef struct A
{
    char a1;
    short int a2;
    int a3;
    double d;
};

A=16

typedef struct B
{
    long int b2;
    short int b1;
    A a;
};

而对于 B,先不要管 A a,也就是先去掉 A a 成员结构体 B 算出其为 8,所以最后结果为 8+16=24;24 才是最后结果。

2、位域内存大小计算原则:定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。

 

// 位域内存测试
#include <stdio.h>
struct ONE_BYTE
{
    unsigned char _bool : 1;
    unsigned char del_flag : 1;
    unsigned char status : 4;
} one_byte;

struct TWO_BYTE
{
    unsigned char ccc1 : 4;
    unsigned char ccc2 : 4;
    unsigned char ccc3 : 4;
    unsigned char ccc4 : 4;
} two_byte;

struct THREE_BYTE
{
    unsigned char ccc1 : 4;
    unsigned char ccc2 : 4;
    unsigned char ccc3 : 4;
    unsigned char ccc4 : 4;
    unsigned char ccc5 : 4;
} three_byte;

struct FOUR_BYTE
{
    unsigned int ccc1 : 16;
    unsigned int ccc2 : 16;
} four_byte;


int main(int argc, char const *argv[])
{
    printf("sizeof one_byte is : %lu\n", sizeof(one_byte));
    printf("sizeof two_byte is : %lu\n", sizeof(two_byte));
    printf("sizeof three_byte is : %lu\n", sizeof(three_byte));
    printf("sizeof four_byte is : %lu\n", sizeof(four_byte));
    return 0;
}

3、共用体内存大小计算原则:共用体变量所占的内存长度等于最长的成员变量的长度。

	union Data
	{
		int i;
		float f;
		char  str[20];
	} data;
	printf("sizeof union Data is : %lu\n", sizeof(data));

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值