zoukankan      html  css  js  c++  java
  • 关于动态内存malloc和realloc

    1.malloc

       1.申请的内存长度可以运行时决定,单位是字节
       2.申请的内存为连续的内存空间
       3.返回的地址可以根据实际需要强转成对应的类型
       4.动态申请内存的生命周期是整个程序,除非手动释放
     
       此时就动态的申请了 100 * 4 长度的内存作为一个整形数组

       int n = 100;
       int* p = (int*)malloc(n * sizeof(int));
       free(p);//此处的代码就可以针对p进行各种操作
     
      注意:
       1.如果 malloc之后没有及时的free,则内存泄漏(memory leak)
       malloc的内存free一次就可以,重复free也是未定义行为
       如果申请了两次malloc但是free一次情况:
         第一次申请的内存使用p进行了保存,接下来修改p的内存后,在也没法找到第一次申请内存的地址,有就无从释放。
     
      
      2.free只是将内存释放,并不会设为NULL
      void Text()
      {
         char* str = (char*)malloc(100);
         strcpy(str, "hello");
         free(str);
         //free只是释放内存,并不会把指针设为NULL
         //此刻应该手动将str设为NULL,这样才不会存在隐患
         if (str != NULL)
         {
          strcpy(str, "world");
          printf(str);
         }
      }
     
    2.realloc
     
    用 realloc 扩容后的空间不一定时原来的空间,如果原来的空间内存之后还有多余的空间可以支持扩容,则会在原有的内存
    空间上进行扩容,如果空间大小不足,则会在重新取一块更大的空间,然后将原来的数据拷贝上去,在释放旧的空间。
     

    3.动态内存实例:

      接下来我们看一下在简易通讯录里怎么实现动态内存的开辟

      在通讯录中实现动态内存,也就是对一个创建一个可以自动扩容的结构体数组

      我们先写一个静态的结构体类型的数组

      

     1 typedef struct PersonInfo
     2 {
     3     //每个联系人的信息
     4     char name[1024];
     5     char sex[1024];
     6     char age[1024];
     7     char phone[1024];
     8     char addrss[1024];
     9     char company[1024];
    10 }PersonInfo;
    11 
    12 typedef struct Book
    13 {
    14     PersonInfo person_book[100];
    15     int size;//通讯录的有效区间
    16 }Book;
    17 
    18 Book g_person_book;
    19 
    20 //初始化
    21 void Init(Book* person_book)
    22 {
    23     assert(person_book != NULL);
    24     memset(person_book,0,sizeof(Book));
    25 
    }

    接下来我们便可以将固定大小的 person_book [100]修改为可以自动扩容的动态。

    修改的时候需要用到 malloc ,则需要将 person_book 修改为指针类型,并加入可以表示最大储存的变量。

    typedef struct Book
     {
         PersonInfo*  book;

         int capacity;//元素的最大储存量  
         int size;//通讯录的有效区间
     }Book;

    其次需要修改初始化中的内容:

    void Init(AddressBook* addr_book)
    {
     //判定传入参数是否为空
     assert(addr_book != NULL);
     addr_book->size = 0;
     addr_book->capacity = 10;
     addr_book->person_infos = (PersonInfo*)malloc(
      sizeof(PersonInfo)*addr_book->capacity);
    }

  • 相关阅读:
    LOJ #2109. 「JLOI2015」骗我呢 数形结合+组合+容斥
    LOJ #2729. 「JOISC 2016 Day 1」俄罗斯套娃 扫描线+贪心
    LOJ #2508. 「AHOI / HNOI2018」游戏 拓扑排序
    LOJ #2106. 「JLOI2015」有意义的字符串 构造+矩阵乘法
    LOJ #2471. 「九省联考 2018」一双木棋 记忆化搜索
    python的md5和base64加密
    [转]python的find()方法
    [转]python的startswith()方法
    获取http请求的响应状态
    with...as...用法
  • 原文地址:https://www.cnblogs.com/cuckoo-/p/10549070.html
Copyright © 2011-2022 走看看