结构体内存分配
1.
结构体内存分配是根据结构体成员的类型大小分配的,且结构体分配内存是实例化之后分配的。
struct demo
{
int a;
char b;
char c;
};
2.
对于以上的结构体,struct demo的大小是多少呢?有些同学会觉得是6个字节,其实并不是,这里的 struct demo 的大小是8个字节。
我们可以用sizeof来测试下
#include<stdio.h>
struct demo
{
int a;
char b;
char c;
};
int main()
{
struct demo stu1;
int a = sizeof(stu1);
printf("%d", a);
return 0;
}
调试运行后输出8
再改变一下结构体内部变量的顺序
struct demo
{
char b;
int a;
char c;
};
int main()
{
struct demo stu1;
int a = sizeof(stu1);
printf("%d", a);
return 0;
}
调试运行后输出12
3.
那么从以上测试代码可以总结出
结构体大小计算时,是以结构体成员的类型大小最大的那个为单位分配的。
分配时,结构体成员类型大小最大的为int,占4个字节。所以该结构体分配内存就以4字节为单位。分配第一个成员char b 时,char占1字节。分配第二个成员int 时,占4个字节,但是第一次分配的4字节被 b 占了4字节,剩下的3字节是不够分配 b的,于是系统再次分配4字节(到此就已经分配了8字节,第一个4字节还有3字节没有被赋值,没关系,系统会用随机值填充)。最后分配char c 时,需要再次分配4个字节(到此分配了8+4个字节),但是这4个字节只占用了1个字节。倘若该结构体后面还有一个成员char d ,那么系统也不会再分配4个字节了。因为剩下3个字节足够容纳 1个字节的char d。只有当不够容纳下一个成员或者容纳满了才会申请下一个单位的字节量的内存。