简介
在复习数组的时候,看到可以用一个变量N来定义数组长度,即a[N],我有点纳闷,既然数组长度可以是变量,为什么会有动态内存分布这种用法去malloc一个内存而创造数组,参考以下两段代码,两个程序运行起来的效果看起来是完全相同的,那么动态内存分布的意义究竟为何?

#include<stdio.h>
int main(int argc , char const * argv[])
{int N;scanf( "%d" , &N );int a[N];for(int i = 0 ; i < N ; i++){a[i] = i;}for(int i = 0 ; i < N ; i++){printf("%-3d" , a[i]);}getchar();return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main( int argc , char const *argv[] )
{int N;scanf( "%d" , &N );int *a;a = (int*)malloc(N*sizeof(int));for( int i = 0 ; i < N ; i++ ){a[i] = i;}for( int i = 0 ; i < N ; i++ ){printf("%-3d" , a[i] );}free( a );getchar();return 0;
}


查了很多资料,其中最主要的一点是说动态内存分配可以动态的申请空间,以便动态确定对象所需要的内存,但是这点靠直接创造本地数组a[N]也可以实现,而且这样反倒简单些,所以请允许我驳回这个观点。
——
此外,动态内存分配的优点还有:
1.方便储存大型对象;
2.在程序运行过程中给予额外的内存空间。

对于第一点,肯定是有道理的:本地数组变量是直接存储在栈区的局部变量,它的大小受限,而动态内存分配创造的是一个在堆中的指针数组,它指向栈区的一块内存,它的大小是任意的;
对于第二点,在本地数组变量a[N]中可以输入一个大于N的数来实现创造多余的空间。
——
综上,动态内存分配的意义只在于储存大型对象,也就是可以创造一个很大很大的数组
——
可是!!!就在我这么认为的时候,突然有另一个问题出现,如果动态内存的分配仅限于此,那么把所有用到动态内存分配的地方改成普通的创造本地数组变量会如何?于是,我的思路紧紧扣在链表这一章知识上。
——
众所周知,一个很长的链表需要不断地malloc和free内存,它的意义并不单纯在于创建一个很大的数组,也在于它可以极大地提高内存的利用率。即在复制新链表的同时,可以手动将之前的旧链表删除,把内存释放出来去存储其他东西,但单纯的本地数组变量却做不到,它只能在一个程序结束时一股脑地全部释放掉,而在此之前它是一直存在着的。可以将想象一下,当你在一个程序中像链表一样不断地创建本地数组,而本地数组却只能在结束时自动释放,本地数组不断堆积,最终会让程序因为内存空间不足而无法执行。

浅谈动态内存分配的意义相关推荐

  1. 动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】

    为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配.一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间.但是,往往初学者在编写这类程序 ...

  2. 浅谈java内存分配和回收策略

    一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配 ...

  3. linux内存分配方式有三种,浅谈操作系统的内存分配原则

    在多道程序当中,如果要让我们的程序运行,必须先创建进程.而创建进程的第一步便是要将程序和对应的数据装入内存.把用户的源程序变成可执行的程序要经历 编译 - 链接 - 装入 三个过程. 此刻我要说的就是 ...

  4. java 内存分配参数_浅谈JAVA内存分配与参数传递

    java中方法的参数传递方式只有一种:值传递. java内存分配: 1.栈:存放 基本类型的数据.对象的引用(类似于c语言中的指针) 2.堆:存放用new产生的数据 3.静态域:存放在对象中用stat ...

  5. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

  6. 【C语言进阶深度学习记录】三十三 C语言中动态内存分配

    如何在程序运行的时候动态给程序分配内存? 文章目录 1 动态内存分配的意义 1.1 C语言中如何动态申请内存空间 1.2 malloc和free的用法 1.3 calloc与realloc 1.31 ...

  7. 【C语言】为什么存在动态内存分配

    文章目录 前言 一.动态内存分配 定义 二.动态内存分配的意义 1.可以控制所开辟的内存大小 2.可以多次利用这部分空间 三,动态内存函数的介绍 前言 提示:我们先来看一个在vs编译器下,同学们常犯的 ...

  8. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  9. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

最新文章

  1. java 中常用的类
  2. 任务间资源共享问题示例
  3. ThreadLocal封装SimpleDateFormat
  4. 蝗虫算法java代码_蝗虫搜索算法 蝗虫算法:蝗虫优化算法是模拟自然界蝗虫种群捕食行为而提出的一 联合开发网 - pudn.com...
  5. 现在的挂黑链外链链接的手法非常的高级
  6. ADO.Net中DataSete的应用
  7. 多线程之 NSOperation
  8. prototype.js学习(2)
  9. 光猫修改html灰色选项,电信光猫怎么设置(修改)wifi密码?
  10. js实现本地上传图片及预览
  11. 【MATLAB】从文件读取:xlsread、load
  12. 什么是静态分析?代码分析工具
  13. Flink SQL Size of the state is larger than the maximum permitted memory-backed state
  14. 中国移动发力5G,月增900万,反超中国电信
  15. 使用Postman访问k8s RESTful API
  16. MyBatis框架学习笔记02:使用MyBatis实现CRUD操作
  17. UiPath的下载安装与基本使用
  18. matlab的fir1截止频率的设置
  19. 联想拯救者笔记本安装Win10、Ubuntu16.04双系统
  20. 基于C语言实现车辆管理系统

热门文章

  1. 英语作文写写学校计算机房,我的学校英语作文3篇
  2. 温湿度雨雪复合传感器
  3. 一文读懂BLDC电机控制算法
  4. web自动化解决全国教师管理系统学分自动录入
  5. 怎么选择虚拟化服务器,支招:中小企业该如何选择虚拟化服务器
  6. Vue3第四篇:集成Windi.css
  7. 【1】Python 3 教程
  8. python3彻底卸载与安装教程
  9. MySQL性能优化(五):分表
  10. 老毛桃win8pe制作工具u盘初始化教程