文章目录

  • 一、为什么存在动态内存分配?
  • 二、动态内存函数的介绍
    • 1.malloc和free
    • 2.calloc函数
    • 3.realloc函数

一、为什么存在动态内存分配?

学习动态内存的管理方法之前,我们需要先探讨一个问题,为什么需要动态内存分配呢?
首先,观察如下代码:

int i = 20;
char arr[10]={0};

可以观察到,上面的代码分别在栈空间上开辟了4个字节和10个字节的空间,但上述开辟空间的方式有两个特点:

  1. 空间开辟大小是固定的。
  2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
    但是通常我们对于空间的需求是在程序运行的时候才知道的,那么数组编译时开辟空间的方式就不能满足了。这时候就需要用到动态内存开辟。

二、动态内存函数的介绍

1.malloc和free

C语言提供了一个动态内存开辟函数—>malloc函数:

void* malloc(size_t size);

这个函数向内存申请一块可连续的空间,并返回只想这块空间的指针(及首元素地址)。
#另外注意这块空间是开辟在堆区的,与栈区不同的是,堆区的空间只有在主动释放掉后或程序正常结束后才会释放;而栈区定义的局部变量在函数调用结束后便会自动销毁。

接下来试用一下malloc函数:

char* ptr = (char*)malloc(1024*1024*1024);
printf("%p\n", ptr);
free(ptr);
return 0;

在free(ptr)处打上断点,观察系统内存,可以看到下图12-9程序已经开辟了1G的空间,并且成功输出地址。


去掉断点后,继续运行程序,看到1G内存已经被释放掉。

对于malloc函数:

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
  • 如果参数 size为0,malloc的行为是标准是未定义的,取决于编译器。

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

void free(void* ptr);

free函数用来释放动态开辟的内存。

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。
    malloc和free都声明在stdlib.h头文件中。

2.calloc函数

C语言还提供了一个函数叫calloc,calloc函数也用来动态内存分配。原型如下:

void* calloc(size_t num,size_t size);
  • 函数的功能是为num个大小为size的元素开辟一个空间,并且把空间的每个字节初始化为0;
  • 与函数malloc的区别只在于calloc会在返回地址前把申请空间的每个字节初始化为0;

3.realloc函数

  • realloc函数的出现让动态内存管理更加灵活。
  • 有时我们会发现过去申请的空间太小了,有时候又会觉得申请的空间过大了,那为了合理地使用内存,我们需要对内存的大小做灵活调整。realloc函数可以做到对动态开辟内存大小的调整。函数原型如下:
void* realloc(void* ptr,size_t size)
  • ptr 是要调整的内存地址.
  • size 调整之后新大小.
  • 返回值为调整之后的内存起始位置。
  • 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
  • realloc在调整内存空间的是存在两种情况:

情况1:原有空间之后有足够大的空间。
情况2:原有空间之后没有足够大的空间。
当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。 (实际过程是:开辟新空间—拷贝旧空间内容—释放旧空间),因此对于情况2,只用释放新空间。

C语言之动态内存管理与动态内存函数相关推荐

  1. 【C 语言必知必会】内存管理、动态分配内存、野指针

    C 语言内存管理.动态分配内存.野指针 文章目录 C 语言内存管理.动态分配内存.野指针 前言: 1.内存分区 1.1 代码区 1.2.1 全局初始化数据区(静态数据区data段) 1.2.2 未初始 ...

  2. Java内存管理:Java内存区域 JVM运行时数据区

    Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...

  3. C++:内存管理:C++内存管理详解

    C++语言内存管理是指:对系统的分配.创建.使用这一系列操作.在内存管理中,由于是操作系统内存,使用不当会造成很麻烦的后果.本文将从系统内存的分配.创建出发,并且结合例子来说明内存管理不当会造成的结果 ...

  4. 鸿蒙系统内存管理,嵌入式系统内存管理-鸿蒙HarmonyOS技术社区-鸿蒙官方战略合作伙伴-51CTO.COM...

    1.概述 操作系统的内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请.释放操作.在嵌入式实时系统中,内存管理根据不同的系统,有不同的策略,对于有些系统支持的虚拟内存管理机制,对于另外一 ...

  5. 属性与内存管理(属性与内存管理都是相互关联的)

    <span style="font-size:18px;"> 属性与内存管理(属性与内存管理都是相互关联的)第一部分一,属性:属性是OC2.0之后出来的新语法,用来取代 ...

  6. Unity 之 Mono内存管理与泄漏 — 内存是手游的硬伤(转)

    WeTest导读 内存是游戏的硬伤,如果没有做好内存的管理问题,游戏极有可能会出现卡顿,闪退等影响用户体验的现象.本文介绍了在腾讯游戏在Unity游戏开发过程中常见的Mono内存管理问题,并介绍了一系 ...

  7. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...

  8. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制--Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  9. C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组

    动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...

最新文章

  1. 软件视频会议Vidyo体验
  2. iOS 问题整理04----Runtime
  3. php psr2规范,php标准规范详解
  4. vue借助axios实现网络通信
  5. 交换排序之冒泡排序和快速排序
  6. CVSNT Manual
  7. K-L变换原理、图像压缩与人脸识别实战(附matlab代码)
  8. django:访问本地静态文件的配置
  9. mysql common是什么_MySQL概述及入门(一)
  10. Gos —— 文件系统
  11. python 给定一个字符串,输出所有指定长度为n的子串,没有则输出-1
  12. 读书笔记:《狼图腾》
  13. 前端初学,记下标签以后参考
  14. 语音转文字怎么转?三个方法让你学会怎么语音转文字
  15. Qt 之设置 QWidget 背景色
  16. echarts 显示隐藏后宽度高度变小问题
  17. 格兰杰因果关系检验(原理及Python实例)
  18. 谈谈SPI (Serial Peripheral Interface,串行外设接口)
  19. 信贷风险指标你都懂吗?
  20. 【Web安全】常见的网站安全及解决方案

热门文章

  1. 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)
  2. python programming training(三):搜索算法
  3. MySQL从入门到精通50讲(四)-MySQL表操作创建表及删除表
  4. MATLAB与图像处理(一):图像中结构张量的求法(Structure Tensor)
  5. Hadoop ssh配置设置
  6. mysql设置数据库同步_MySQL数据库配置主从同步
  7. QT在windows平台安装使用MInGW编译
  8. 本地Python连接服务器中的Mysql数据库
  9. 数据库新秀 postgresql vs mongo 性能PK
  10. spring security oauth2 架构---官方