首页 >> 大全

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

2023-09-20 大全 26 作者:考证青年

结构体内存分配

1.结构体内存分配是根据结构体成员的类型大小分配的,且结构体分配内存是实例化之后分配的。

struct demo
{int a;long b;char c;
};

对于以上的结构体, demo的大小是多少呢?有些同学会觉得是13个字节,其实并不是,这里的 demo 的大小是24个字节。

我们可以用 ()来测试下结果:

_c分配内存空间语法_程序中内存分配方式

#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.结构体内存分配图解

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了