C语言中申请变量顺序不同而导致占用内存大小不同的问题

C语言中申请变量时顺序不同,会导致占用的内存不能,特别是在使用结构体时,结构体内的变量是连续存放的,使用不当,将会浪费大量内存空间,下面以代码说说明

1、

#include <stdio.h>
#include <string.h>
#define u8 unsigned char
#define u16 unsigned short int
#define	u32 unsigned int
typedef struct
{
	u16 a;
	u8  b;
	u16 c;
	u32 d;
	u8  e;
	u16 f;

		
}TEST_TpyeDed; 

TEST_TpyeDed test;

int main()
{
	printf("a:%d\n",(u32)(&test.a));
	printf("b:%d\n",(u32)(&test.b));
	printf("c:%d\n",(u32)(&test.c));
	printf("d:%d\n",(u32)(&test.d));
	printf("e:%d\n",(u32)(&test.e));
	printf("f:%d\n",(u32)(&test.f));
	printf("test size:%d\n",sizeof(test));
	printf("TEST_TpyeDed size:%d\n",sizeof(TEST_TpyeDed));

}

运行结果:

可以看到,结构体大小为16字节,从输出的地址可以得出,b、e虽然定义为8位,但却都占用了2字节,c虽然定义为16位,但占用了4字节。这是因 为,字节变量地址会以单字节对齐,字变量地址会以双字节对齐,双字变量地址会以4字节对齐

2、再来看另一个程序

#include <stdio.h>
#include <string.h>
#define u8 unsigned char
#define u16 unsigned short int
#define	u32 unsigned int
typedef struct
{
	u8  b;
	u8  e;
	u16 a;
	u16 c;
	u16 f;
	u32 d;
	
}TEST_TpyeDed; 

TEST_TpyeDed test;

int main()
{
	printf("a:%d\n",(u32)(&test.a));
	printf("b:%d\n",(u32)(&test.b));
	printf("c:%d\n",(u32)(&test.c));
	printf("d:%d\n",(u32)(&test.d));
	printf("e:%d\n",(u32)(&test.e));
	printf("f:%d\n",(u32)(&test.f));
	printf("test size:%d\n",sizeof(test));
	printf("TEST_TpyeDed size:%d\n",sizeof(TEST_TpyeDed));

}

运行结果

可以看到,此时结构体的大小12字节,节省了4个字节空间,

 

所以在申请变量顺序时,尽量让变量连续存放,减少空间浪费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值