要弄懂这个问题,首先你得知道静态和动态指的是什么。个人觉得卡耐基上的解释很经典:

“The word static refers to things that happen at compile time and link time when the program is constructed—as opposed to load time or run time when the program is actually started.”

“The term dynamic refers to things that take place when a program is loaded and executed. ”

说白了,内存的静态分配和动态分配的区别主要是两个:

一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。

二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。

对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。

一般,用static修饰的变量,全局变量位于静态数据区。函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。

其它:

所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

例如我们定义一个float型数组:float score[100];   

但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点:

   1、不需要预先分配存储空间;

   2、分配的空间可以根据程序的需要扩大或缩小。

要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.

malloc函数的原型为:void *malloc (unsigned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

原文地址:http://hi.baidu.com/wu_yuzhi/blog/item/8bafc18a4922c2759f2fb4cb.html

静态分配和动态分配内存的区别相关推荐

  1. 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别

    内存的静态分配和动态分配的区别[转] 来源: <http://blog.csdn.net/liuchao1986105/article/details/6724392> 内存的静态分配和动 ...

  2. 内存的静态分配和动态分配的区别【转】

    来源: <http://blog.csdn.net/liuchao1986105/article/details/6724392> 内存的静态分配和动态分配的区别主要是两个: 一是时间不同 ...

  3. 内存的静态分配和动态分配的区别

    内存的静态分配和动态分配的区别主要是两个: 一是时间不同.静态分配发生在程序编译和连接的时候.动态分配则发生在程序调入和执行的时候. 二是空间不同.堆都是动态分配的,没有静态分配的堆.栈有2种分配方式 ...

  4. 【imessage苹果推送扫号过滤软件】安装静态分配和动态分配。 静态分配是编译器的完竣

    线程里边比不上零丁的地点空间,线程已经灭亡. 它即是全部进程,是以多历程法式比多线程程序更壮大,但在过程中它本钱. 资本很是大,效力差. 可是,对于或多或少需求,您只好利用某些标量的辈出操纵. 4.仓 ...

  5. 以太网技术(地址静态分配和动态分配)

    1.以太网概念 以太网是以CSMA/CD方式工作的一种总线式局域网,由美国Xerox公司的PaloAlto 2.以太网的MAC层 1.MAC地址 局域网中每台主机必须具有一个可唯一标识其地址的标识符. ...

  6. 【中级软考】绑定、静态绑定、动态绑定、静态分配、动态分配是什么?

    绑定是一个把过程调用和响应调用而需要执行的代码加以结合的过程.在一般的程序设计语言中绑定是在编译时进行的,叫做静态绑定. 动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码结合直到调用发生时才 ...

  7. 静态内存分配与动态内存分配

    静态内存分配与动态内存分配 动机 平时看c/c++的书籍时,总会看到一种观点,说是C/C++语言使用的时候动态内存分配是最重要的,使用malloc等函数分配的内存必须要释放,否则及其容易出现内存泄露. ...

  8. php 堆内存和栈内存,内存分配堆与栈的区别

    堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义.一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈 ...

  9. CC++动态分配内存(手动分配内存)三种方式

    1. malloc函数 函数原型:void *malloc(unsigned int size) 函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址.  可以 ...

最新文章

  1. 选本还是从缓存设计理念选择更好
  2. C语言文件操作解析(二)【转载】
  3. 下列哪个不是python合法的变量名_下列哪个不是Python中合法的数据类型?
  4. golang 读取 ini配置信息
  5. 【QA】Xcodeproj doesn't know about the following xxx 问题及解决方案
  6. CVPR 2020最新热点:物体位姿估计
  7. Ⅲ:zookeeper之查看节点的状态及其监听器的使用
  8. 5.6 稳健最小二乘法
  9. 将整个表单设置为只读_如何将独立网站设置为制作中,阻止搜索引擎收录网站页面?...
  10. python数据分析笔记中panda(2)
  11. jmeter测试工具应用场景【测试帮日记公开课】
  12. 同一个行业为什么股票差异大?
  13. size_t 和int 无符号整型和有符号整型
  14. Python 优雅获取本机 IP 方法【转】
  15. 跳石头 vijos1981 NOIP2015 D2T1 二分答案 模拟 贪心
  16. SAP MM 条件技术透析
  17. python连连看_Python-连连看
  18. 【Linux内核分析与应用-陈莉君】进程的调度
  19. 汉诺塔,简单递归带你破解出攻略
  20. mavennexus环境搭建

热门文章

  1. openstack架构及组件特点
  2. python下各种包的安装
  3. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
  4. oracle 数据库的非指令备份方法
  5. 编写彩色空间转换程序:YUVtoRGB
  6. [知识图谱实战篇] 三.Python提取JSON数据、HTML+D3构建基本可视化布局
  7. [LeetCode] First Bad Version - 二分查找
  8. OpenGL ES之Swift使用GLSL语言渲染图片的显示
  9. Ubuntu系发行版安装deepin wine QQ的步骤
  10. 征战蓝桥 —— 2018年第九届 —— C/C++B组第1题——第几天