`

一步一步写算法

 
阅读更多

转自  http://blog.csdn.net/feixiaoxing/article/details/6839301

 

 

内存是程序运行的基础。所有正在运行的代码都保存在内存里面。内存需要处理各种各样的数据,包括键盘的数据、鼠标的数据、usb的数据、串口的数据、摄像头的数据,那么这些数据经过程序的处理之后,就要进行输出到串口、屏幕、usb等。

    内存只有一个,但是程序里面的空间有很多种。但是内存中的数据类型只有几种,比如说全局中的数据、堆中的数据、临时堆栈中的数据。那么他们有什么区别呢?我们可以通过代码发现一些问题。

    (1)全局数据

  1. static   int  value = 100;  
  2.   
  3. void  process()  
  4. {  
  5.     static   int  number = 10;  
  6. }  

    大家可以在这里看到,value和number的数据其实都属于全局数据,这里的变量是不随着函数的调用发生变化的。

 

    (2)堆数据

  1. void  process()  
  2. {  
  3.     char * point = ( char *)malloc(100);  
  4.     free(point);  
  5. }  

    这里的point分配的数据就是堆数据,如果没有free操作,那么它的存在也是全局的。只要内存不主动释放,那么这个内存就会以一直存在。

 

    (3)临时数据

  1. void  process()  
  2. {  
  3.     char  name[100] = {0};  
  4.     return ;  
  5. }  

    这里的数据都是堆栈内部的数据,一旦process调用结束返回之前,那么name地址指向的内存空间已经被其他函数使用。此时这段内存空间对我们来说 已经没有什么意义了。所以,不管在函数里面用了多少空间,如果你想在函数返回之前继续使用里面的数据,务必在函数返回前拷贝完毕。

    这篇博客的内容比较简单,主要讲述了内存的一些内容。其实关于内存的东西还很多。这里说明一下只是让大家有一个了解:

    1) 全局数据是我们喜欢使用的类型,用起来比较方便

    2)堆数据是系统给我们安排的空间

    3)堆栈空间只能存在于当时的函数之中,函数返回即失去意义

 

    虽然我们上面这么说,但是这三个概念有的时候也是可以相互迁移的,比如说:

    1) 有的时候,我们为了测试的需要,首先构建一个全局内存池,以后测试的内存都是通过自定义的malloc在内存池中分配的,所以这个时候,堆分配和全局联系在了一起。

                全局内存空间          < =========>  内存池     < =========> 本地空间分配

    2) 如果我们使用的函数空间比较小,那么所有的操作就可以在一个函数内部完成了,那么这时候全局空间和临时堆栈是不是一致的呢

               全局空间   < =============>  本地堆栈

 

    上面的说法有些绕,但是我们的目的只是想让大家时刻明白:

    a)必须时刻明白我们的数据在哪块空间里面

    b)内存会不会越界

    c)内存会不会泄露

    d)内存访问的数据是否依然有效

 

......

分享到:
评论

相关推荐

    一步一步写算法(全)

    "一步一步写算法(全)"这个资源显然包含了丰富的算法学习材料,可能是由一系列教程、笔记或者实战案例组成的集合。这份资源的价值在于其全面性,覆盖了算法学习的多个方面,对于想要提升算法能力的程序员或学生来说...

    一步一步写算法C

    在CSDN上发布的“一步一步写算法C”通过一系列步骤,帮助初学者深入理解如何用C语言编写、理解和优化算法。 首先,我们认识到了算法的重要性。在软件开发中,算法是决定程序功能和效率的关键。没有正确的算法,软件...

    极客学院算法wiki

    3. **一步一步写算法 - v1.0**: 这个版本可能更注重实践,引导学习者逐步构建算法。它可能包含逐步的代码实现和详细的步骤解释,让读者能够亲手编写并理解每一种算法,从而加深记忆和理解。 4. **坐在马桶上学...

    自己写的AES加密算法,输出每一步的结果

    标题“自己写的AES加密算法,输出每一步的结果”表明这是一个个人实现的AES加密过程,能够展示加密的各个步骤。这通常对于学习和理解AES的工作原理非常有帮助。下面将详细解释AES加密的基本概念、流程以及每个步骤的...

    《一步一步写嵌入式操作系统》书上的源码

    《一步一步写嵌入式操作系统》是一本面向初学者的优秀教程,旨在引导读者逐步了解并构建自己的嵌入式操作系统。这本书的源代码是学习过程中的重要辅助材料,它提供了实践操作系统的具体步骤和实例,帮助读者更好地...

    算法设计与分析之贪心算法学习课件

    贪心算法是计算机科学中一种重要的算法设计策略,它在解决优化问题时,通常采取每一步选择局部最优解的方式来逐步逼近全局最优解。本套课件“算法设计与分析之贪心算法学习”旨在帮助初学者理解和掌握这种算法思想。...

    算法谜题(算法谜题).pdf

    - 贪心算法:在每一步选择中都采取当前状态下最好的或最优的选择策略。 - 回溯法:逐步构建解空间树,当发现所选择的路径无法达到最优解时,则退回一步重新选择。 2. **算法分析技术**: - 时间复杂度分析:评估...

    十三个常用算法

    九(再续)、教你一步一步用c 语言实现sift 算法、上九(再续)、教你一步一步用c 语言实 现sift 算法、下 十、从头到尾彻底理解傅里叶变换算法、上 十、从头到尾彻底理解傅里叶变换算法、下 十一、从头到尾彻底解析...

    用C和java写的一些经典基础的算法

    8. 贪心算法:在每一步选择最优解,以期望得到全局最优解,例如霍夫曼编码。 9. 回溯算法:在解决问题时,当发现当前路径无法到达目标时,回溯到上一步,尝试其他路径,如八皇后问题。 10. 广义表、栈、队列、链表...

    贪心算法 贪心 算法 贪心的算法

    贪心算法是一种优化策略,它在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的。这种算法通常用于解决复杂问题,通过局部最优解逐步逼近全局最优解。贪心算法并不...

    经典算法 贪婪算法.rar

    贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。贪婪算法的特点在于它总是做出局部最优的选择,期望这些局部最优的选择能导出全局最优解。然而...

    智能优化算法实现(matlab)_数学建模

    在MATLAB中,禁忌搜索涉及设定初始解、禁忌长度、停止条件等参数,并在每一步中根据禁忌策略和邻域搜索策略更新解。 4. **混沌优化**(Chaos Optimization):混沌优化利用混沌系统的遍历性和随机性来寻找全局最优...

    DDA算法、中点bresenham算法及bresenham算法画直线

    算法的基本思想是计算每一步沿x轴和y轴的增量,然后根据这些增量更新当前像素位置。由于DDA算法计算量较大,尤其是在处理大量像素时,效率相对较低。 接着,我们来讨论Bresenham算法。Bresenham算法是为了解决DDA...

    夜深人静写算法(四)算法设计与分析第四次作业

    夜深人静写算法(四)算法设计与分析第四次作业涉及了多个重要主题,包括贪心算法、动态规划、图算法等。在贪心算法方面,我们学习了如何通过每一步的最优选择来得到整体的最优解,例如霍夫曼编码、最小生成树等问题...

Global site tag (gtag.js) - Google Analytics