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個字節空間,

 

所以在申請變量順序時,儘量讓變量連續存放,減少空間浪費

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章