结构体内存分配理解

复制代码

1
#include <stdlib.h> 2 #include <iostream> 3 #include <string.h> 4 5 using namespace std; 6 struct key 7 { 8 void *key; 9 int size; 10 }; 11 12 struct doclist 13 { 14 int i; 15 int j; 16 struct key k; 17 void *entry; 18 }; 19 20 int main() 21 { 22 doclist* d = (doclist*)malloc(sizeof(doclist) + 5); 23 d->i = 1; 24 d->j = 2; 25 key k; 26 k.key=(void*)malloc(5); 27 memset(k.key,'l',5); 28 d->k.key=d+1; 29 memcpy(d->k.key,k.key,5); 30 cout << "doclist:" <<sizeof(doclist)<<":"<<sizeof(*d)<<"\n"; 31 cout << "key:" << sizeof(key)<<":"<<sizeof(d->k)<<"\n"; 32 return 0; 33 }
复制代码

d的地址为:

*d为:

其中i的地址为0x601010,j的地址为0x601014.其中每位地址对应一个byte的实际空间,而int的大小为4个byte。如下图

而d中key的地址为:0x601018,

因为分配空间是给d分配了sizeof(doclist) + 5大小的空间,且d的类型为doclist,所以d+1指向了0x601010+0x20(32即struct doclist大小)的地址,使用d->k.key=d+1将该5个大小的空间地址赋给key,使其可以进行空间操作。

而由于malloc时记录了给d分配了sizeof(doclist) + 5大小的空间,所以最后只需要free(d)即可,系统会自动将所以空间释放。如果单独为d->k.key分配空间,则最后还需要再释放d->k.key。

posted @   鸭子船长  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2015-08-25 简述Session 、Cookie、cache 区别
2015-08-25 数据库中索引的优缺点
2015-08-25 多线程访问共享内存的不加锁实现方式
2015-08-25 Linux下用信号量实现对共享内存的访问保护
2015-08-25 链表中倒数第k个结点
2015-08-25 调整数组顺序使奇数位于偶数前面
2015-08-25 数值的整数次方
点击右上角即可分享
微信分享提示