struct与union内存分配问题

今天在调试代码时,关于struct与union内存分配问题产生了疑惑,故上网查询了相关资料,记于此,以便日后查看。

struct与union在内存分配的时候,主要区别如下:

前者按照结构体内定义的数据顺序来进行分配内存的,分配的基本单位(即:每分配一次的量)是struct里面所定义的最长数据类型的长度;后者联合体内的数据共用一块内存,是以union里面所定义的最大类型长度的整数倍来分配内存的。

定义之类的东东总是让人感到枯燥乏味,举个形象的例子,有一个struct类型变量定义如下:

struct {
	int a;
	char b;
	double c;
}demo;

那么系统分配给demo结构体的内存空间是多大呢?

答案是16!为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c。

试想一下,如果这个struct类型变量其内存定义的变量顺序改变成如下所示:

struct {
	int a;
	double b;
	char c;
}demo;

那个系统分给这个struct的内存空间又是多少呢?

应该是24!知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。所以在结构体里面最好按照类型从小到大的顺序来


一个简单的测试例子:

#include <stdio.h>

struct S1 {
	char c;
	double b;
};

struct S2 {
	char c1;
	double b;
	char c2;
};

struct S3 {
	char c1;
	char c2;
	double b;
};

union U1 {
	char c;
	double b;
};

union U2 {
	char c1;
	double b;
	char c2;
};

union U3 {
	char c1;
	char c2;
	double b;
};

union U4 {
	int a[5];
	double b;
};

int main()
{
	printf("sizeof(S1) = %d\n", sizeof(S1));
	printf("sizeof(S2) =%d\n", sizeof(S2));
	printf("sizeof(S3) =%d\n", sizeof(S3));
	printf("sizeof(U1) = %d\n", sizeof(U1));
	printf("sizeof(U2) = %d\n", sizeof(U2));
	printf("sizeof(U3) = %d\n", sizeof(U3));
	printf("sizeof(U4) = %d\n", sizeof(U4));

	return 0;
}

/**
 * 运行结果:
 * sizeof(S1) = 16
 * sizeof(S2) = 24
 * sizeof(S3) = 16
 * sizeof(U1) = 8
 * sizeof(U2) = 8
 * sizeof(U3) = 8
 * sizeof(U4) = 24
 */





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值