结构体所占内存大小划分原则:
1、划分字节,按照当前结构体中,字节数最大的类型作为划分单元。【这里面还有一些前提。下面的例子会详细说到】
2、以矩形块儿的形式划分。
#include <stdio.h>
/**划分示意图:
最小单元是 double所以 这个 地方按照8个字节作为最小单元来划分。
*/
struct student1
{
double avgMark;
int ID;
};
/**划分示意图:
最小单元不能是数组这个地方的最小单元是 1个字节
*/
struct student2{
char name[5];
char id[2];
};
/**划分示意图:
数组不作为划分单元,所以最小划分单位是int 4个字节。
*/
struct student3{
int ID;
char name[10];
};
/**划分示意图:
30个格格就不画了。但是可以很明显的知道,划分单元是4个字节。这样name部分会浪费两个字节,所以它的占地面积是36个字节。
*/
struct BaseInfo{
char name[30];
int age;
};
/**划分示意图:
这个 划分就格外有说法了,划分单元到底取4还是取36.C语言作为一门经久不衰的语言,想想也不可能是36,要是BaseInfo里面写一个char name[100],那一个student4就会浪费100个字节。这太可怕了。这就是它把每一个结构体都要细分的原因,方便这个结构体融入到别的别的结构体中。
*/
struct student4{
int ID;
struct BaseInfo baseInfo;
};
/**划分示意图:
也不画了,char a会浪费3个字节,char c会浪费3个字节,一共占地面积是12个字节。
*/
struct test1{
char a;
int b;
char c;
};
/**划分示意图:
a和c共享一行,然后浪费两个字节,
Int单独占一行,所以总共的占地面积是8个字节。
*/
struct test2{
char a;
char c;
int b;
};
int main(){
printf("sizeof(struct student1) = %d\n", sizeof(struct student1));//这个案例在开始看视频的时候,就想写了,毕竟double占8个字节。16
printf("sizeof(struct student2) = %d\n", sizeof(struct student2));//7
printf("sizeof(struct student3) = %d\n", sizeof(struct student3));//16
printf("sizeof(struct student5) = %d\n", sizeof(struct student4));//40
printf("sizeof(struct test1) = %d\n", sizeof(struct test1));//12
printf("sizeof(struct test2) = %d\n", sizeof(struct test2));//8
getchar();
return 0;
}
后面这部分是想着想着觉得不对劲,补进来的:
struct test3{
double a;
};
struct test4{
struct test3 t3;
char a;
};
试试test4的占地面积吧~~~还蛮好玩的。
附运行结果: