- 使用64位系统,地址占用8个字节
- (一)联合union内存占用情况分析:
- 变量共用内存,如下若修改a,b也会跟着改变
union u { int a; int b; }; union u mu; mu.a = 1; printf("mu.b = %d", mu.b); //输出:mu.b = 1
- 占用内存为最大的变量类型所占用内存的整数倍,如有char、int和double类型,则占用内存为8字节的整数倍(double类型占用8字节)
union u { char a[9]; //9*1=9字节 int b[3]; //3*4=12字节 double c; //8字节 }; printf("%lu\n", sizeof(union u)); //输出:16 #8*2=16大于任意变量所需字节数
- (二)结构体struct内存占用情况:
- 不共用内存,以占用最大字节的变量所占内存空间为单位来开辟内存,故结构体大小也为占用最大字节变量大小的整数倍
struct s { char a[3]; //3字节 long b; //8字节 }; printf("%lu\n",sizeof(struct s)); //输出:16
- 变量是按照的顺序存储,当下一个变量在当前4字节内放不下时,就会重新使用一个4字节空间,变量的对内存占用有影响
struct s { char a[2]; //2字节 int b; //4字节 与上的2字节共用一个8字节空间 long c; //8字节 char d; //1字节 单独使用8字节空间 }; printf("%lu\n", sizeof(struct s)); //输出:24
struct s { char a[2]; //2字节 int b; //4字节 与上的2字节共用一个8字节空间 char d; //1字节 单独使用8字节空间 long c; //8字节 }; printf("%lu\n", sizeof(struct s)); //输出:24
struct s { char a[2]; //2字节 char d; //1字节 与上面2字节一起共用一个4字节空间 int b; //4字节 与上两个一起共用一个8字节空间 long c; //8字节 }; printf("%lu\n", sizeof(struct s)); //输出:16