问:为什么要动态分配内存

答1:因为内存太宝贵。

答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。

答3:给定一个占用内存可变大小的变量(假设是数组的长度len),给该变量通过函数动态分配内存后,分配内存的大小是根据数组的长度len决定的,假定用户输入len的大小是5,系统就会动态的给该数组分配长度为5的内存,该段代码运行结束后,系统调用free()函数释放分配的内存,然后接着运行剩下的程序。换句话说,动态分配内存可以根据需要去申请内存,用完后就还回去,让需要的程序用。

问:什么时候需要动态分配内存

答:当程序中有比较大的数据块需要使用内存的时候使用。原因:比较大的数据块如果使用了静态内存,在该数据块运行完毕后不能动态的释放该内存,直到整个程序运行完才能释放,如果整个程序比较大,有可能因为内存不够而发生错误。

问:难道不可以在该静态分配的内存使用完后,使用free()函数释放吗?

答:不可以,首先malloc() 函数和free()函数必须是配套使用,其次free()函数不能释放普通变量,只能释放指针。

问:什么时候需要动态分配内存(网友整理:https://blog.csdn.net/sinat_39085247/article/details/74356820)

答:什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!

计算机内存的四大区域:栈区,常量区,全局区,堆区(动态分配)

  1. 栈   区:在栈里面储存一些我们定义的局部变量以及形参;
  2. 常量区:主要是储存一些字符常量;
  3. 全局区:在全局区里储存一些全局变量和静态变量;
  4. 堆       :堆主要是通过动态分配的储存空间;

以数组为例子来说明动态分配和释放内存

#include<stdio.h>
#include<malloc.h>
int main()
{int len;//定义数组的长度int *pArr=(int *)malloc(sizeof(int)*len);for(int i=0;i<len;++i)scanf("%d"\n,&pArr[i]);for(i=0;i<len;++i)printf("%d\n",*(pArr+i));free(pArr);  //pArr指向数组的首地址pArr = NULL;/*...剩余代码...*/return 0;}

问:为什么malloc函数前面需要int *的强制转换?

答:因为程序需要告诉编译器malloc函数返回值的第一个字节是int *类型的还是其他类型的。

1:代码中的malloch函数分配内存,在该段代码运行完后,通过free()函数释放,被释放的内存空间留着可以被剩余代码接着利用。

2:同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针,何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!

为什么要动态分配内存?什么时候需要动态分配内存?相关推荐

  1. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  2. JVM内存管理:深入Java内存区域与OOM

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝 ...

  3. java直接内存为什么快_直接内存与 JVM 源码分析

    直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...

  4. c语言的内存管理方式,c语言内存管理

    2017-08-23 作用域 一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域.代码块是{}之间的一段代码. auto 自动变量 一般情况下代码块内部定义的变量都是自动变量.当然也 ...

  5. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  6. Java内存管理:深入Java内存区域

    Java内存管理:深入Java内存区域 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述 ...

  7. linux内存管理分析 二,linux内存管理分析【二】

    为建立内存管理系统,在内核初始化过程中调用了下面几个函数: init/main.c asmlinkage void __init start_kernel(void) { ...... 初始化持久映射 ...

  8. 全面介绍Windows内存管理机制及C++内存分配实例(六):堆栈

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  9. 全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  10. 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

最新文章

  1. 解决 Dynamics AX 2009 部署报表时错误
  2. 如何在asp.net页面使用css和js
  3. python图形化编程实例,python交互式图形编程实例(三)
  4. 性能测试之JMeter中JSON断言详解
  5. [No0000DD]C# StringEx 扩展字符串类 类封装
  6. 三维模型等大长方体剖分算法实现
  7. AHP层次分析法(附matlab程序)
  8. S7-1200智能IO设备使用方法
  9. DIY LDAC蓝牙接收器(一)预备篇
  10. 学计算机程序ui设计,学习UI设计需要什么样的电脑配置
  11. 看了鲁迅的平面设计,很多设计师表示可能要转行了
  12. 公众号快速涨粉方法汇总
  13. 如何给电脑硬盘分区?
  14. Kubeadm搭建高可用K8S(四)Dashboard安装配置
  15. 在OpenCV里绘制直线、圆、中文等图形
  16. 二层基本知识点(一)
  17. 系统云端服务器,系统云端服务器
  18. 手把手教你EEG脑电数据预处理-原理篇
  19. 编码解码(HtmlEncode与HtmlEncode)
  20. matlab三维数组与二维矩阵相乘问题

热门文章

  1. 高通在华起诉苹果:要求在中国禁止生产和销售 iPhone
  2. ubuntu启动失败黑屏解决方案
  3. android pc os,Remix OS Android pc
  4. TRBBex:抱着一夜暴富这种心态是很难賺钱的
  5. 什么是全员营销?企业开展全员营销的好处
  6. [数据结构]练习6-树
  7. angularjs双向数据绑定原理解析
  8. 转行小姐姐的码农之路
  9. python tkinter 窗口禁止编辑_Tkinter Toplevel 禁止主窗口功能
  10. mantis 修改语言为繁体