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