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个字节空间,

 

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

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页