zoukankan      html  css  js  c++  java
  • 结构体内存分配理解


    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)<<" "; 31 cout << "key:" << sizeof(key)<<":"<<sizeof(d->k)<<" "; 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。

  • 相关阅读:
    CentOS Linux更改MySQL数据库目录位置
    CodeCombat第一关:KITHGARD地牢之KITHGARD精通
    aspose将word转pdf时乱码,或者出现小方框问题
    go ---switch语句
    go ---作用域及判断变量类型的方式。
    golang 学习笔记 --基本类型
    892. 三维形体的表面积
    70. 爬楼梯
    centOS安装java
    CentOS7安装MySQL
  • 原文地址:https://www.cnblogs.com/zl1991/p/7428885.html
Copyright © 2011-2022 走看看