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.动态内存实例:

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

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

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

  

 typedef struct PersonInfo
{
//每个联系人的信息
char name[];
char sex[];
char age[];
char phone[];
char addrss[];
char company[];
}PersonInfo; typedef struct Book
{
PersonInfo person_book[];
int size;//通讯录的有效区间
}Book; Book g_person_book; //初始化
void Init(Book* person_book)
{
assert(person_book != NULL);
memset(person_book,,sizeof(Book));

}

接下来我们便可以将固定大小的 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);
}

关于动态内存malloc和realloc的更多相关文章

  1. C—动态内存分配之malloc与realloc的区别

    在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap).还有另一个内存区域,称为堆栈(stack),其中的空间分配给函数的参数和本地变量.在执行完该函数后,存储参数和本地变量的内存空间就会 ...

  2. C语言中动态内存的分配(malloc,realloc)

    动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...

  3. 内存动态分配之realloc(),malloc(),calloc()与new运算符

    1,malloc与free是C/C++的标准库函数,new/delete是C++的运算符,是C++面向对象的特征,它们都可用于申请动态内存和释放内存.2,对于非内部数据类型的对象而言,光用maloc/ ...

  4. 内存分配函数malloc、realloc、calloc、_alloca

    1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...

  5. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  6. 内存分配机制malloc&&alloca&&realloc

    <1>从静态存储区域分配.       内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2>在栈上创建       在执 ...

  7. 动态内存管理:malloc/free/new/delete/brk/mmap

    这是我去腾讯面试的时候遇到的一个问题——malloc()是如何申请内存的? c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, c ...

  8. malloc函数 链表 运行时才知道内存 动态内存

    https://baike.baidu.com/item/malloc函数 malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void ...

  9. 转: Linux C 动态内存分配 malloc及相关内容 .

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

随机推荐

  1. 安卓constraintLayout中app:srcCompat设置的图片显示不出来

    使用 app:srcCompat 的时候 引入的图片显示不出来的解决方案 首先查看的你的Activity 继承的是那个Activity 如果是继承AppcompatActivity  使用 Image ...

  2. 对啊英语音标---二、ghywr这些辅音怎么发音

    对啊英语音标---二.ghywr这些辅音怎么发音 一.总结 一句话总结:对比法,和汉语拼音做对比 对比法,和汉语拼音做对比 1.清辅音和浊辅音的区别是什么? 清辅音-[不需要声带震动]就能发出的音节: ...

  3. 【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份

    在数据库管理中,数据库备份是非常重要的. 通过维护计划向导,可以很方便的完成数据库备份. 下面的例子说明了如何实现数据库的备份,具体的备份策略是:每周日一次完整备份.每天差异备份(除周日外).每小时日 ...

  4. HTML辅助方法

    顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HT ...

  5. postman加密短信验证码

    问题描述:有一个绑定手机号的接口需要向手机发送验证码,接口会将验证码进行base64编码加密,加密后的值赋值给code参数,其他接口请求均需要code参数,如何带上该参数 解决方案:在请求其他接口前请 ...

  6. Python进程、线程、协成

    什么是线程?程序执行的最小单位线程是进程中的一个实体,是被系统独立调度和分派的基本单位 线程的创建threading.Thread(target = 变量名) 线程的资源竞争问题线程是可以资源共享的同 ...

  7. 高并发情况下Linux系统及kernel参数优化

    众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参数方面和IO事件分配机制等.下面就从几方面来调整使Linux系统能够支持高并发环境. Iptabl ...

  8. VUE + vue-cli + webpack 创建新项目

    首先记录一下命令. 这是一个睿智新手的笔记. p.s.这是配置好环境以后的命令. ----------------------------------------------- $ npm insta ...

  9. Win10安装CAD2006

    以管理员身份运行 提示如下问题: 查看该隐藏文件如下: 开始以为是未安装MSI Runtime 3.0和.NET Framework Runtime 1.1的原因,下载并安装后还是提示如上问题. 仔细 ...

  10. inline元素、block元素、inline-block元素

    inline 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行,直到该行排满. block 块级元素:是可以控制宽和高.margin等,并且会换行.块级对象元素会单独占一行显示, ...