【C语言】struct结构体内存如何分配

结构体内存分配
1.结构体内存分配是根据结构体成员的类型大小分配的 , 且结构体分配内存是实例化之后分配的 。
【【C语言】struct结构体内存如何分配】struct demo{int a;long b;char c;};
对于以上的结构体 ,  demo的大小是多少呢?有些同学会觉得是13个字节 , 其实并不是 , 这里的demo 的大小是24个字节 。
我们可以用 ()来测试下结果:

【C语言】struct结构体内存如何分配

文章插图
#include struct demo{int a;long b;char c;};int main(){demo myd;printf("sizeof(struct demo):%d\n", sizeof(myd));}
输出结果为:
那么从以上测试代码可以总结出:
1.结构体大小计算时 , 是以结构体成员的类型大小最大的那个为单位分配的 。
分配时 , 结构体成员类型大小最大的为long , 占8个字节 。所以该结构体分配内存就以8字节为单位 。分配第一个成员int a 时 , int占4字节 。分配第二个成员long b 时 , 占8个字节 , 但是第一次分配的8字节被 a 占了4字节 , 剩下的4字节是不够分配 b的 , 于是系统再次分配8字节(到此就已经分配了16字节 , 第一个8字节还有四字节没有被赋值 , 没关系 , 系统会用随机值填充) 。最后分配char c 时 , 需要再次分配8个字节(到此分配了16+8个字节) , 但是这8个字节只占用了1个字节 。倘若该结构体后面还有一个成员 int f  , 那么系统也不会再分配8个字节了 。因为剩下7个字节足够容纳 4个字节的int f 。只有当不够容纳下一个成员或者容纳满了才会申请下一个单位的字节量的内存 。
2.结构体的对象分配内存是结构体实例化之后才分配的 , 在栈内或堆内分配 。但是如果有成员是静态变量 , 那么该成员是定义结构体时就分配 。(实例化之后 , 也就是我们说的对象 , 是分配在栈或者堆上 。而定义结构体时 , 结构体作为一个类型 , 是会在代码区分配内存的 , 且这个内存不可变 。)
结构体的对象分配内存 , 成员是普通变量则是分配在栈上的(叫做局部变量) , 当成员是指针时 , 如 char * buf;可以为其在堆上分配空间 。char * buf = (char *)(256);当成员是静态变量时 ,  如int k;则属于全局变量 , 分配在全局区 , 全局有效 。
2.结构体内存分配图解