栈于堆的区别与联系(拓展补充)——入门级别

联系

  • 0、栈与堆都是操作系统在给正在执行的程序分配的内存的一部分

程序执行过程

  • 1、他们都是操作系统内存管理的组成部分

  • 2、编程中使用的数据都存储在内存中。从硬件的角度看,被存储的每个值都占用一定的物理内存,故它们都是一定存在的物理内存

区别

  • 0、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

  • 1、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收,分配方式倒是类似于链表

  • 2、函数A用堆分配的内存,可在函数B用使用和释放

物理内存

  • 3、函数A用栈分配的内存,到函数B中无效,不存在

拓展补充:

  • 0、C提供多种管理内存的模型。学会如何选择不同的类别。大多数情况下,最好选择自动变量。如果要使用其他变量,应该有充足的理由。通常,使用自动变量、函数形参和返回值进行函数间的通信时比使用全局变量(在函数外部定义,适用于在程序中保持不变的数据)更安全

  • 1、静态存储类别所用的内存的数量在编译的时候就固定了(就是那些static 声明的变量),在程序运行期间也不会改变,就是说只要程序还在运行,就可访问储存在该部分的数据。此类别的变量在程序开始执行时被创建,在程序结束时才会被销毁。

  • 2、自动存储类别的( 自动 )变量(就是正常声明、定义的变量)在程序进入变量定义所在的块时存在,在程序离开块时消失。其使用的内存数量在程序执行期间自动增加或减少。 (因为多多少少一个程序会有主调函数调用另一个函数,而当主调函数调用时,计算机会为被调函数中的自动变量主动分配内存(栈中分配)【故内存数量增加】,而当某个被调函数返回到主调函数时,其内部的自动变量就被计算机自动释放(释放在栈中的变量)【故内存数据减少】。根据栈的特点,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁。
    栈运行过程

  • 3、动态分配的内存在调用malloc( )或相关函数时存在,在调用free( )后释放。这部分的内存由程序员管理。动态分配的内存数量只会增加(堆中分配),除非free()函数进行释放 ,在free()之前,此动态内存一直存在。实际上,如果没有成对的使用malloc( )和free( ),内存池内存将会慢慢被耗尽。称为内存泄露(memory leak)。故在函数某尾调用free( )函数可避免这类问题发生。另外,使用动态内存通常比使用栈内存慢。

  • 4、理解静态内存(static声明)、自动内存(正常的局部变量)和动态分配(malloc()或相关函数的属性。注意:静态内存的数量在编译确定:静态数据在载入程序时被载入内存。在程序运行时,自动变量被分配或释放,所以自动变量占用的内存数量随着程序的运行会不断变化。可以把自动内存看作是可重复利用的工作区。动态分配的内存也会增加和减少,但是这个过程由函数调用控制(malloc( )\free( )),不是自动进行的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ocodotial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值