结构体内存分配理解


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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值