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